分享Google+的意图无法访问图片

Sim*_*ays 14 android image android-intent google-plus android-sharing

我打算分享图像的意图.这适用于大多数提供商,但适用于Google+.Google+会在没有图片的情况下打开帖子活动并显示祝词"您只能发布存储在设备上的照片".同时.

    File f = storeImage(image); // f = /data/data/com.myapp/files/1333070776978.jpg
    Uri uri = Uri.fromFile(f);

    Intent share = new Intent(Intent.ACTION_SEND);
    share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    share.setType("image/jpeg");
    share.putExtra(Intent.EXTRA_STREAM, uri);
    share.putExtra(Intent.EXTRA_TITLE,"Share that title");
    share.putExtra(Intent.EXTRA_SUBJECT,"Share that subject");
    share.putExtra(Intent.EXTRA_TEXT,"Check that out...");
    share.putExtra("sms_body", "sms body");
    startActivity(Intent.createChooser(share, "Share Image"));
Run Code Online (Sandbox Code Playgroud)

我保存图像

    Context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
Run Code Online (Sandbox Code Playgroud)

我的理解是,通过设置FLAG_GRANT_READ_URI_PERMISSION,我授予Google+特定访问权限.

当我将图像存储到MediaStore时它可以工作,但我实际上不想弄乱用户图像库.

    ContentValues values = new ContentValues(2);
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.Images.Media.DATA, f.getAbsolutePath());
    Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏

西蒙

mat*_*ash 6

Google+无法file://从其他应用程序的私人文件夹访问Uris.并且FLAG_GRANT_READ_URI_PERMISSION在这种情况下不起作用,因为它仅适用于意图的"数据"部分中的Uris,而不适用于额外内容.

一个常见的解决方法是将其添加到库(通过MediaStore),但没有必要这样做.在这种情况下,正确的解决方案是使用FileProvider:

FileProvider是ContentProvider的一个特殊子类,它通过content://为文件而不是Uri 创建Uri来促进与应用程序关联的文件的安全共享 file:///.

首先将以下内容放在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>
Run Code Online (Sandbox Code Playgroud)

然后这个文件在res\xml\filepaths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="shared_images" path="shared_images/" />
</paths>
Run Code Online (Sandbox Code Playgroud)

然后,要共享图像文件,请确保它位于上面指定的路径中(即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);
Run Code Online (Sandbox Code Playgroud)

(确保getUriForFile()方法中指定的权限与清单中的权限相匹配).

这将产生一个content://Uri(就像content://com.myapp.testshare.fileprovider/shared_images/img1.pngGoogle+应用程序将能够访问,因此包含在帖子中).