android - Google+ 的分享 Intent 无法访问图片

标签 android image android-intent google-plus android-sharing

我正在调用一个共享图像的 Intent 。这适用于大多数提供商,但适用于 Google+。 Google+ 打开没有图像的帖子 Activity 并显示提示框“您只能发布存储在您设备上的照片。”同时。

    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"));

我保存图片

    Context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);

我的理解是,通过设置 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);

感谢任何建议

西蒙

最佳答案

Google+ 无法从另一个应用程序的私有(private)文件夹访问 file:// Uris。 FLAG_GRANT_READ_URI_PERMISSION 在这种情况下不起作用,因为它仅适用于 Intent 的“数据”部分中的 Uris,而不适用于 extras。

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

FileProvider is a special subclass of ContentProvider that facilitates secure sharing of files associated with an app by creating a content:// Uri for a file instead of a 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>

然后,要共享图像文件,请确保它位于上面指定的路径中(即 getFilesDir() 下的 shared_images)并按如下方式构建 Intent :

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() 方法中指定的权限与 list 中的权限相匹配)。

这将生成一个 content:// URI(如 content://com.myapp.testshare.fileprovider/shared_images/img1.png,Google+ 应用将能够访问,从而包含在帖子中)。

关于android - Google+ 的分享 Intent 无法访问图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935926/

相关文章:

Android ListFragment 错误

android - 为什么这个 android 取消警报不起作用?

java - 如何在recyclerview firebase中动态更改limitToFirst()?

android - 如果我使用的目标 SDK 版本是 21,我可以在 API 23 上运行我的应用吗

python + opencv - 如何正确比较图像(通过直方图)?

java - "Forwarding"用Java上传图片

image - matlab使白色背景透明png

java - 有哪些选项可用于解决间歇性 Permission Denial SecurityException?

Android - BroadcastReceiver 不接收自定义 Intent

java - 无法从切换按钮到第二个 Activity 获取值