Advertisement
bissei

python+kivy NFC example

Jun 22nd, 2016
818
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.97 KB | None | 0 0
  1. main.py:
  2. import kivy
  3.  
  4. from kivy.app import App
  5. from kivy.lang import Builder
  6. from kivy.uix.screenmanager import Screen,ScreenManager
  7. from kivy.core.window import Window
  8. import hashlib
  9. import binascii
  10. from jnius import autoclass, cast
  11. from android.runnable import run_on_ui_thread
  12. from android import activity
  13.  
  14. NfcAdapter = autoclass('android.nfc.NfcAdapter')
  15. PythonActivity = autoclass('org.renpy.android.PythonActivity')
  16. Intent = autoclass('android.content.Intent')
  17. IntentFilter = autoclass('android.content.IntentFilter')
  18. PendingIntent = autoclass('android.app.PendingIntent')
  19. NdefRecord = autoclass('android.nfc.NdefRecord')
  20. NdefMessage = autoclass('android.nfc.NdefMessage')
  21. Tag = autoclass('android.nfc.Tag')
  22. IsoDep = autoclass('android.nfc.tech.IsoDep')
  23. MifareClassic = autoclass('android.nfc.tech.MifareClassic')
  24. MifareUltralight = autoclass('android.nfc.tech.MifareUltralight')
  25. Ndef = autoclass('android.nfc.tech.Ndef')
  26. NfcA = autoclass('android.nfc.tech.NfcA')
  27. NfcB = autoclass('android.nfc.tech.NfcB')
  28. NfcF = autoclass('android.nfc.tech.NfcF')
  29. NfcV = autoclass('android.nfc.tech.NfcV')
  30.  
  31. Window.clearcolor = (.36,.44,.43,1)
  32. Window.softinput_mode = 'resize'
  33.  
  34. Builder.load_file("test.kv")
  35.  
  36. class StartScreen(Screen):
  37.  
  38. def __init__(self, **kwargs):
  39. super(StartScreen, self).__init__(**kwargs)
  40.  
  41.  
  42. class tester(App):
  43. def build(self):
  44. self.nfc_init()
  45. return sm
  46.  
  47. def nfc_init(self):
  48. activity.bind(on_new_intent=self.on_new_intent)
  49. self.j_context = context = PythonActivity.mActivity
  50. self.nfc_adapter = NfcAdapter.getDefaultAdapter(context)
  51. self.nfc_pending_intent = PendingIntent.getActivity(context, 0, Intent(context, context.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0)
  52. self.enable_foreground_dispatch()
  53. return True
  54.  
  55. @run_on_ui_thread
  56. def disable_foreground_dispatch(self):
  57. self.nfc_adapter.disableForegroundDispatch(self.j_context)
  58.  
  59. @run_on_ui_thread
  60. def enable_foreground_dispatch(self):
  61. self.nfc_adapter.enableForegroundDispatch(self.j_context, self.nfc_pending_intent, None,None)
  62.  
  63. def on_pause(self):
  64. self.disable_foreground_dispatch()
  65. return True
  66.  
  67. def on_resume(self):
  68. self.enable_foreground_dispatch()
  69.  
  70. def on_new_intent(self, intent):
  71. print 'on_new_intent()', intent.getAction()
  72.  
  73. # get TAG details
  74. tag = cast('android.nfc.Tag', intent.getParcelableExtra(NfcAdapter.EXTRA_TAG))
  75. details = self.get_ndef_details(tag)
  76.  
  77. def get_ndef_details(self, tag):
  78. ''' Get all the details from the tag.
  79. '''
  80. sm.get_screen('start').text_box.text=""
  81. tag_details = ""
  82. details = {}
  83. try:
  84. #print 'id'
  85. tag_details= "UID: "+':'.join(['{:02x}'.format(bt & 0xff) for bt in tag.getId()])
  86. #print 'technologies'
  87. tag_details+="\nTECH LIST: "+str(tag.getTechList())
  88. #print 'get NDEF tag details'
  89. ndefTag = cast('android.nfc.tech.Ndef', Ndef.get(tag))
  90. #print 'tag size'
  91. tag_details+="\nSIZE: "+str(ndefTag.getMaxSize())
  92. #print 'is tag writable?'
  93. tag_details+="\nWRITABLE: "+str(ndefTag.isWritable())
  94. # get size of current records
  95. ndefMesg = ndefTag.getCachedNdefMessage()
  96. #print 'tag type'
  97. tag_details+="\nTAG TYPE: "+str(ndefTag.getType())
  98. # check if tag is empty
  99. if not ndefMesg:
  100. tag_details+="\nNDEF MESSAGE: NO NDEF MESSAGE"
  101. else:
  102. ndefrecords = ndefMesg.getRecords()
  103. length = len(ndefrecords)
  104. recTypes = []
  105. for record in ndefrecords:
  106. recTypes.append({
  107. 'type': ''.join(map(unichr, record.getType())),
  108. 'payload': ''.join(map(unichr, record.getPayload()))
  109. })
  110. tag_details+="\nREC TYPES: "+str(recTypes)
  111. except Exception as err:
  112. print "ERROR: "+str(err)
  113. sm.get_screen('start').text_box.text=tag_details
  114. return details
  115.  
  116. sm = ScreenManager()
  117. sm.add_widget(StartScreen(name='start'))
  118.  
  119.  
  120. if __name__ == '__main__':
  121. tester().run()
  122.  
  123.  
  124.  
  125. test.kv:
  126. <StartScreen>:
  127. text_box: _text_box
  128.  
  129. GridLayout:
  130. rows: 3
  131. Label:
  132. text: 'NFC TESTER'
  133. font_size: 100
  134. AnchorLayout:
  135. anchor_x: 'center'
  136. anchor_y: 'center'
  137. TextInput:
  138. id: _text_box
  139. text: ''
  140. background_color: .79,.98,.98,1
  141. size_hint: .9,.9
  142. AnchorLayout:
  143. anchor_x: 'center'
  144. anchor_y: 'center'
  145. Button:
  146. text: 'Clear text box'
  147. background_color: .79,.98,.98,1
  148. size_hint: .4, .6
  149. on_release: root.text_box.text=''
  150.  
  151.  
  152.  
  153. nfc_filter.xml:
  154. <intent-filter>
  155. <action android:name="android.nfc.action.TAG_DISCOVERED"/>
  156. <category android:name="android.intent.category.DEFAULT"/>
  157. </intent-filter>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement