Google + не может получить доступ к file://
Uris из личной папки другого приложения.И FLAG_GRANT_READ_URI_PERMISSION
в этом случае не работает, потому что он предназначен только для Uris в части «данных» Intent, но не для дополнительных.
Один из распространенных способов - добавить его в галерею (черезMediaStore
) но это не обязательно.Правильным решением в этом случае является использование FileProvider
:
FileProvider - это специальный подкласс ContentProvider, который обеспечивает безопасный общий доступ к файлам, связанным с приложением, путем создания content://
Uri для файла вместо file:///
Uri.
Сначала поместите следующее в свой AndroidManifest.xml
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myapp.testshare.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
Затем этот файл в res\xml\filepaths.xml
:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_images" path="shared_images/" />
</paths>
Затем, чтобы поделиться файлом изображения, убедитесь, что он находится по указанному выше пути (то есть shared_images
в getFilesDir()
), и создайте намерение следующим образом:
File file = getImageFileToShare();
Uri fileUri = FileProvider.getUriForFile(this, "com.myapp.testshare.fileprovider", file);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
intent.setType("image/png");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
(Убедитесь, что права доступа, указанные в методе getUriForFile()
, совпадают с полномочиями, указанными в манифесте.)
Это создаст content://
Uri (например, content://com.myapp.testshare.fileprovider/shared_images/img1.png
, к которому приложение Google+ сможет получить доступ, ипри этом включите в пост).