Kivy Android Intent Filters
July 23, 2014 4 Comments
Intent filters are Android’s equivalent of file associations. When you click on a file in a file manager on Android it starts the associated application by using an intent. Applications can support the emission of intents with different categories. Other apps which have registered to receive intents of that category can then receive and process them.
In order to make use of these intents from Kivy/buildozer you need to add an intent-filter to your a file (by default called intent_filters.xml) in your app’s root directory. You also need to edit the buildozer.spec file to point to the file (look for this line and uncomment):
# (str) XML file to include as an intent filters in <activity> tag
android.manifest.intent_filters=intent_filters.xml
The intent filter will differ depending on the intent. Intents based on mimetypes are better than those based on paths. Apparently there’s a problem with Android’s file search algorithm so you need to specify every relevant directory level if you want to filter on the file’s extension (seriously!). Sample intent (from my art gridder app, which uses files with a .bag extension:
<intent-filter>
<action android:name=”android.intent.action.VIEW” />
<category android:name=”android.intent.category.DEFAULT” />
<data android:mimeType=”*/*” />
<data android:scheme=”file” />
<data android:host=”*” />
<data android:port=”*” />
<data android:pathPattern=”.*..*..*..*..*.bag” />
<data android:pathPattern=”.*..*..*..*.bag” />
<data android:pathPattern=”.*..*..*.bag” />
<data android:pathPattern=”.*..*.bag” />
<data android:pathPattern=”.*.bag” />
</intent-filter>
Finally, your app needs to be able to receive and extract the intent (don’t expect to find this in the docs!):
if __name__ == "__main__": if platform=="android": from jnius import cast from jnius import autoclass import android import android.activity # test for an intent passed to us PythonActivity = autoclass('org.renpy.android.PythonActivity') activity = PythonActivity.mActivity intent = activity.getIntent() intent_data = intent.getData() try: file_uri= intent_data.toString() except AttributeError: file_uri = None
Then pass the file uri to the app when you instantiate it.
Hello, I search a simple sample of python/kivy code in order to red NFC tag. Impossible to find a complete sample. I have object as ‘PythonActivity”, “NfcAdapter.getDefaultAdapter()”, “intent”, but after …. the blackhole. PythonActivity.mActivity.startActivity(intent) ? nfcAdapter.enableReaderMode ? Can you hep me ?
Here is full working example, http://pastebin.com/8avhuksU . I finally managed solve my problem to read NFC, thanks to Stackoverflow….
I prepared that example from all pieces which was around internet.
In buildozer you don’t need intent filter if you just read NFC when your program is active. Here is modifications for default buildozer file which I have:
source.include_exts = py,png,jpg,kv,atlas,pyc
# (list) Permissions
android.permissions = NFC
# (int) Android API to use
android.api = 19
# (int) Minimum API required
android.minapi = 14
# (int) Android SDK version to use
android.sdk = 24
# (str) Android NDK version to use
android.ndk = 10d
#android.manifest.intent_filters = nfc_filter.xml
Hi, I’m also stuck with python+kivy+buildozer+nfc. I was able to get NFC reading work if tag contains text, but in all other cases it doesn’t work. It would be great to get simple example how to to read NFC with all information (not only NDEF).
hey can you help me with that
how can i read text from nfc tag in my app