-
Notifications
You must be signed in to change notification settings - Fork 2k
Description
While trying to get the Android camera to work, I found a few hoops I needed to jump through to get the FileProvider accessible. So I was wondering if we couldn't somehow make it configurable, sort of like Activities?
I needed to clone the python-for-android repo and add the following to pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="org.content.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
I also needed to create the directory pythonforandroid/bootstraps/sdl2/build/src/main/res/xml, and in it the file file_paths.xml, with the following content:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." />
</paths>
I also had to add support-compat-28.0.0.aar and had to use API 28 as the target for my build. All of this is required to save an image taken with the camera to external storage.
Having thought about all this, I think it might be tricky to get a generic solution for all ContentProviders, so maybe we can add some predefined ones to choose from, starting with FileProvider?
I'm not 100% sure what all this would entail, but I was thinking something along the lines of:
- Adding the following to the
default.buildozer.spec:
# (list) Java providers to the manifest.
# Only FileProvider is supported at this point.
# This requires support-compat-28.0.0.aar.
#android.add_providers = android.support.v4.content.FileProvider
- Adding the following to the
buildozerrepo intargets/android.py:
# add Java provider
add_providers = config.getlist('app', 'android.add_providers', [])
for provider in add_providers:
build_cmd += [("--add-provider", provider)]
-
Adding the following to
pythonforandroid/bootstraps/common/build/build.py:ap.add_argument('--add-provider', dest='add_provider', action='append',
help='Add this Java class as a Provider to the manifest.') -
Adding the following to
pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml(although here we might require theauthoritiesattribute to configurable as well, and in general this solution isn't fantastic):
{% for p in args.add_provider %}
{% if p == "android.support.v4.content.FileProvider" %}
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="org.content.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
{% endif %}
{% endfor %}
- And finally - the part that I have the least of an idea of how to implement - just creating the
pythonforandroid/bootstraps/sdl2/build/src/main/res/xml/file_paths.xmlfile as described above.
I might be missing part of the puzzle here, but I'm happy to make pull requests if this is something that seems like we could implement and with some guidance for where I'm coming short.