Приложение закрыто после запуска ChooserActivity, чтобы поделиться изображением с другими приложениями - PullRequest
0 голосов
/ 07 мая 2020

На устройствах Samsung с Android 10 у нас есть проблема, что наше приложение закрывается после запуска ChooserActivity, чтобы поделиться изображением, созданным нашим приложением.

Нет никаких исключений в журналах или чем-либо еще. Для пользователя это выглядит так, как будто наше приложение просто закрывается.

Мы не видим такого поведения на других устройствах.

Но на моем тестовом устройстве Nokia с Android 10 есть запись в logcat.

2020-05-06 15:48:04.033 4509-4543/packagename E/DatabaseUtils: Writing exception to parcel
java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://packagename.provider/cache/image-to-share.jpeg from pid=2753, uid=1000 requires the provider be exported, or grantUriPermission()
    at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:742)
    at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:615)
    at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:606)
    at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:520)
    at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:307)
    at android.os.Binder.execTransactInternal(Binder.java:1021)
    at android.os.Binder.execTransact(Binder.java:994)

С последующим предупреждением

2020-05-06 15:48:04.034 2753-5090/? W/ChooserActivity: Could not load (content://packagename.provider/cache/image-to-share.jpeg) thumbnail/name for preview. If desired, consider using Intent#createChooser to launch the ChooserActivity, and set your Intent's clipData and flags in accordance with that method's documentation

Я не Не знаю, может ли это быть причиной того, что устройства Samsung просто перестают работать с нашим приложением. На наших тестовых устройствах все работает, хотя в журналах есть такие сообщения.

Вот код того, как мы запускаем ChooserActivity

val share = Intent(Intent.ACTION_SEND)
share.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)

share.type = "*/*"
share.putExtra(Intent.EXTRA_TEXT, link)

share.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(activity!!, BuildConfig.APPLICATION_ID + ".provider", fileToShare!!))
startActivityForResult(Intent.createChooser(share, "Share Image"), REQUEST_CODE_CHOOSER_INTENT)

Вот определение нашего поставщика файлов в AndroidManifest.xml

<provider
  android:name="androidx.core.content.FileProvider"
  android:authorities="${applicationId}.provider"
  android:exported="false"
  android:grantUriPermissions="true">
  <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths" />
</provider>

И file_paths.xml выглядит так

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="cache" path="."/>
</paths>

Есть ли у кого-нибудь эта проблема на устройствах Samsung или может сказать мне, как исправить ошибку, которую мы видим в наших журналах, чтобы мы могли проверить, решит ли это проблему на устройствах Samsung?

Обновление: Мы обнаружили следующее исключение в журналах.

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
    Process: android:ui, PID: 26528
    java.lang.RuntimeException: java.net.URISyntaxException: Illegal character in authority at index 8: https://{{ogunsecureurl}}/
        at com.android.okhttp.HttpUrl.uri(HttpUrl.java:357)
        at com.android.okhttp.internal.http.RouteSelector.resetNextProxy(RouteSelector.java:123)
        at com.android.okhttp.internal.http.RouteSelector.<init>(RouteSelector.java:63)
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:188)
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144)
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:483)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:135)
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90)
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30)
        at com.android.internal.app.ChooserActivity.semCreateWebThumbnail(ChooserActivity.java:3194)
        at com.android.internal.app.ChooserActivity.semLoadWebMetaData(ChooserActivity.java:3151)
        at com.android.internal.app.ChooserActivity$ContentPreviewCoordinator.lambda$semLoadUrlIntoView$2$ChooserActivity$ContentPreviewCoordinator(ChooserActivity.java:593)
        at com.android.internal.app.-$$Lambda$ChooserActivity$ContentPreviewCoordinator$1JseasSRHRaydwh9UhAQ6FjbwOA.run(Unknown Source:12)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: java.net.URISyntaxException: Illegal character in authority at index 8: https://{{ogunsecureurl}}/
        at java.net.URI$Parser.fail(URI.java:2892)
        at java.net.URI$Parser.parseAuthority(URI.java:3230)
        at java.net.URI$Parser.parseHierarchical(URI.java:3141)
        at java.net.URI$Parser.parse(URI.java:3097)
        at java.net.URI.<init>(URI.java:583)
        at com.android.okhttp.HttpUrl.uri(HttpUrl.java:350)
        at com.android.okhttp.internal.http.RouteSelector.resetNextProxy(RouteSelector.java:123) 
        at com.android.okhttp.internal.http.RouteSelector.<init>(RouteSelector.java:63) 
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:188) 
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144) 
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106) 
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400) 
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333) 
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:483) 
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:135) 
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90) 
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30) 
        at com.android.internal.app.ChooserActivity.semCreateWebThumbnail(ChooserActivity.java:3194) 
        at com.android.internal.app.ChooserActivity.semLoadWebMetaData(ChooserActivity.java:3151) 
        at com.android.internal.app.ChooserActivity$ContentPreviewCoordinator.lambda$semLoadUrlIntoView$2$ChooserActivity$ContentPreviewCoordinator(ChooserActivity.java:593) 
        at com.android.internal.app.-$$Lambda$ChooserActivity$ContentPreviewCoordinator$1JseasSRHRaydwh9UhAQ6FjbwOA.run(Unknown Source:12) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:919)

Кто-нибудь знает, что здесь происходит. Набор полномочий uri - это просто имя пакета наших приложений.

Ответы [ 2 ]

0 голосов
/ 19 мая 2020

Мне удалось исправить эту проблему с помощью небольшого обходного пути. Ошибка возникла, когда я пытался передать дополнительный URL-адрес в ChooserActivity, например

share.putExtra(Intent.EXTRA_TEXT, "https://my.domain.com")

. Это вызывает java.net.URISyntaxException только на устройствах Samsung с Android 10, упомянутых в моем вопросе выше. Передача URL-адреса подобным образом работает.

share.putExtra(Intent.EXTRA_TEXT, "https://www.my.domain.com")

Но мне нужен URL-адрес без www and, поэтому я ставлю пробел до и после URL. Это тоже работает. Может быть, потому, что Samsung ChooserActivity не пытается анализировать эту строку как URL.

share.putExtra(Intent.EXTRA_TEXT, " https://my.domain.com ")

Этот трюк у меня работает. Может быть, кто-нибудь сочтет это полезным или у меня есть объяснение, почему это происходит.

0 голосов
/ 07 мая 2020

Как указано в ошибке, сделайте поставщик файлов экспортируемым в компоненте поставщика в AndroidManifest. xml файл -

android:exported="true"

попробуйте это так. Ваш провайдер будет выглядеть так -

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="true"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...