Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- main.py:
- import kivy
- from kivy.app import App
- from kivy.lang import Builder
- from kivy.uix.screenmanager import Screen,ScreenManager
- from kivy.core.window import Window
- import hashlib
- import binascii
- from jnius import autoclass, cast
- from android.runnable import run_on_ui_thread
- from android import activity
- NfcAdapter = autoclass('android.nfc.NfcAdapter')
- PythonActivity = autoclass('org.renpy.android.PythonActivity')
- Intent = autoclass('android.content.Intent')
- IntentFilter = autoclass('android.content.IntentFilter')
- PendingIntent = autoclass('android.app.PendingIntent')
- NdefRecord = autoclass('android.nfc.NdefRecord')
- NdefMessage = autoclass('android.nfc.NdefMessage')
- Tag = autoclass('android.nfc.Tag')
- IsoDep = autoclass('android.nfc.tech.IsoDep')
- MifareClassic = autoclass('android.nfc.tech.MifareClassic')
- MifareUltralight = autoclass('android.nfc.tech.MifareUltralight')
- Ndef = autoclass('android.nfc.tech.Ndef')
- NfcA = autoclass('android.nfc.tech.NfcA')
- NfcB = autoclass('android.nfc.tech.NfcB')
- NfcF = autoclass('android.nfc.tech.NfcF')
- NfcV = autoclass('android.nfc.tech.NfcV')
- Window.clearcolor = (.36,.44,.43,1)
- Window.softinput_mode = 'resize'
- Builder.load_file("test.kv")
- class StartScreen(Screen):
- def __init__(self, **kwargs):
- super(StartScreen, self).__init__(**kwargs)
- class tester(App):
- def build(self):
- self.nfc_init()
- return sm
- def nfc_init(self):
- activity.bind(on_new_intent=self.on_new_intent)
- self.j_context = context = PythonActivity.mActivity
- self.nfc_adapter = NfcAdapter.getDefaultAdapter(context)
- self.nfc_pending_intent = PendingIntent.getActivity(context, 0, Intent(context, context.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0)
- self.enable_foreground_dispatch()
- return True
- @run_on_ui_thread
- def disable_foreground_dispatch(self):
- self.nfc_adapter.disableForegroundDispatch(self.j_context)
- @run_on_ui_thread
- def enable_foreground_dispatch(self):
- self.nfc_adapter.enableForegroundDispatch(self.j_context, self.nfc_pending_intent, None,None)
- def on_pause(self):
- self.disable_foreground_dispatch()
- return True
- def on_resume(self):
- self.enable_foreground_dispatch()
- def on_new_intent(self, intent):
- print 'on_new_intent()', intent.getAction()
- # get TAG details
- tag = cast('android.nfc.Tag', intent.getParcelableExtra(NfcAdapter.EXTRA_TAG))
- details = self.get_ndef_details(tag)
- def get_ndef_details(self, tag):
- ''' Get all the details from the tag.
- '''
- sm.get_screen('start').text_box.text=""
- tag_details = ""
- details = {}
- try:
- #print 'id'
- tag_details= "UID: "+':'.join(['{:02x}'.format(bt & 0xff) for bt in tag.getId()])
- #print 'technologies'
- tag_details+="\nTECH LIST: "+str(tag.getTechList())
- #print 'get NDEF tag details'
- ndefTag = cast('android.nfc.tech.Ndef', Ndef.get(tag))
- #print 'tag size'
- tag_details+="\nSIZE: "+str(ndefTag.getMaxSize())
- #print 'is tag writable?'
- tag_details+="\nWRITABLE: "+str(ndefTag.isWritable())
- # get size of current records
- ndefMesg = ndefTag.getCachedNdefMessage()
- #print 'tag type'
- tag_details+="\nTAG TYPE: "+str(ndefTag.getType())
- # check if tag is empty
- if not ndefMesg:
- tag_details+="\nNDEF MESSAGE: NO NDEF MESSAGE"
- else:
- ndefrecords = ndefMesg.getRecords()
- length = len(ndefrecords)
- recTypes = []
- for record in ndefrecords:
- recTypes.append({
- 'type': ''.join(map(unichr, record.getType())),
- 'payload': ''.join(map(unichr, record.getPayload()))
- })
- tag_details+="\nREC TYPES: "+str(recTypes)
- except Exception as err:
- print "ERROR: "+str(err)
- sm.get_screen('start').text_box.text=tag_details
- return details
- sm = ScreenManager()
- sm.add_widget(StartScreen(name='start'))
- if __name__ == '__main__':
- tester().run()
- test.kv:
- <StartScreen>:
- text_box: _text_box
- GridLayout:
- rows: 3
- Label:
- text: 'NFC TESTER'
- font_size: 100
- AnchorLayout:
- anchor_x: 'center'
- anchor_y: 'center'
- TextInput:
- id: _text_box
- text: ''
- background_color: .79,.98,.98,1
- size_hint: .9,.9
- AnchorLayout:
- anchor_x: 'center'
- anchor_y: 'center'
- Button:
- text: 'Clear text box'
- background_color: .79,.98,.98,1
- size_hint: .4, .6
- on_release: root.text_box.text=''
- nfc_filter.xml:
- <intent-filter>
- <action android:name="android.nfc.action.TAG_DISCOVERED"/>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement