Kivy на Android, исключение JVM: попытка вызвать виртуальный метод ... для ссылки на пустой объект - PullRequest
0 голосов
/ 20 марта 2020

Мы пытаемся получить доступ к камере Android в приложении Kivy, которое мы создаем. Сначала мы выбрали plyer, но получили ошибку ClipData.Item.getUri(). В итоге мы попытались следовать описанным здесь деталям: https://github.com/kivy/plyer/issues/500#issuecomment -565532048

Теперь, похоже, возникла проблема с получением URI для файла.

Мы добавили это в AndroidManifest.tmpl.xml:

<manifest>
    <application>
    ...

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="org.our.appnamehere"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"/>
    </provider>

    </application>
</manifest>

и это также в file_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths  xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path  name="external_files"  path="Android/data/org.our.appnamehere/files/Pictures"  />
</paths>

Мы попытались изменить строку android:authorities на org.our.appnamehere.provider и org.our.appnamehere.fileprovider, а также изменение соответствующего getUriForFile в данном файле из ссылки выше

...

photo_file = self._create_image_file()

if photo_file is not None:
    photo_uri = FileProvider.getUriForFile(
                    self.currentActivity.getApplicationContext(),
                    self.currentActivity.getApplicationContext().getPackageName(),
                    photo_file
                )

...

на self.currentActivity.getApplicationContext().getPackageName() + '.provider' или self.currentActivity.getApplicationContext().getPackageName() + '.fileprovider'.

Приложение успешно создает файл, на который ссылается photo_file, так как мы можем получить к нему доступ в Android/data/org.our.appnamehere/files/Pictures. Мы всегда получаем следующую ошибку, предположительно из строки photo_uri:

JavaException("JVM Exception occurred: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference")

Смартфон, на котором мы запускаем скомпилированное приложение, находится на Android P ie, версия 9.

Почти все решения этой ошибки выглядят так же, как те, которые мы добавили в манифест и путь_файла. xml. В дополнение к нескольким вариантам android:authorities, мы также попробовали следующие строки из этой ссылки: https://github.com/jkwiecien/EasyImage/issues/103#issuecomment -304304045

        <provider
            ...
            tools:replace="android:authorities">
            <meta-data
                ...
                tools:replace="android:resource"/>
        </provider>

Они на самом деле не работают, и мы все еще можем не получить доступ к камере. Мы могли бы просто упустить что-то очевидное ...

Любая помощь будет принята с благодарностью. Большое спасибо.

1 Ответ

0 голосов
/ 27 марта 2020

На самом деле мы просто упускали что-то очевидное.

Выполнение

buildozer android clean

и восстановление .apk сделали свое дело. Намек был, что теги <provider> не включены в манифест .apk, несмотря на то, что он находится в шаблоне.

Теперь мы можем делать снимки и сохранять файлы с помощью камеры.

Что происходит сейчас в том, что приложение, похоже, не возобновляет работу после захвата, но это отдельная проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...