Как вы делитесь изображениями через намерение в мгновенном приложении?
Мы создаем приложение для мгновенного опроса, в котором пользователь может выполнить тест, а затем поделиться своим результатом. Мы делимся текстом со ссылкой, а также изображением, показывающим результаты опроса пользователя. Когда мы проходим этот поток в установленном приложении, проблем не возникает, однако в мгновенном приложении образ не может поделиться.
Вот как мы генерируем намерение:
val uri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", image)
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, content)
putExtra(Intent.EXTRA_STREAM, uri)
type = "image/*"
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
activity?.startActivity(Intent.createChooser(shareIntent, getString(R.string.quiz_share_title)))
Вот провайдер в нашем базовом манифесте приложения:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/fileprovider" />
</provider>
Когда пользователь делится изображением в мгновенном приложении, это сообщение об ошибке появляется в logcat:
java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.redacted.fileprovider/shared/1563809004297.png from pid=29184, uid=1000 requires the provider be exported, or grantUriPermission()
Я попытался установить exported="true", и это запускает мгновенное приложение при запуске со следующим исключением:
java.lang.RuntimeException: Unable to get provider androidx.core.content.FileProvider: java.lang.SecurityException: Provider must not be exported
Я предполагаю, что мгновенные приложения не могут использовать флаг FLAG_GRANT_READ_URI_PERMISSION по той же причине, по которой они не могут использовать разрешение WRITE_EXTERNAL_STORAGE.
Есть ли другой способ обмена изображениями в мгновенных приложениях?
3 ответа
Мгновенное приложение не может быть экспортировано ContentProvider
, Это ограничение безопасности, и сбой приложения здесь работает так, как задумано.
Вы могли бы использовать InstantApps.showInstallPrompt()
перед запуском Intent, чтобы пользователи могли установить приложение, прежде чем делать это. Убедитесь, что вы выводите сообщение, содержащее обоснование, иначе вы можете запутать своих пользователей.
Есть и другие способы обмена изображениями с помощью мгновенных приложений. Но это зависит от того, откуда исходит изображение. В случае внешнего поставщика контента (то есть приложения камеры) вы должны быть в состоянии переадресовать URI.
Используйте этот фрагмент кода, чтобы поделиться изображением из каталога:
private void shareImage() {
Intent share = new Intent(Intent.ACTION_SEND);
// If you want to share a png image only, you can do:
// setType("image/png"); OR for jpeg: setType("image/jpeg");
share.setType("image/*");
// Make sure you put example png image named myImage.png in your
// directory
String imagePath = Environment.getExternalStorageDirectory()
+ "/myImage.png";
File imageFileToShare = new File(imagePath);
Uri uri = Uri.fromFile(imageFileToShare);
share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, "Share Image!"));
}
Вы можете поделиться чем-либо, используя класс Intent
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "Image URL");
startActivity(intent);