【问题标题】:Share image on other apps not working in Oreo 8.0在 Oreo 8.0 中无法使用的其他应用程序上共享图像
【发布时间】:2018-08-12 06:29:10
【问题描述】:

我正在使用此代码在 Whatsapp、Facebook 和 Instagram 等上分享图像。 此代码在 API 25 以下工作正常,但在 API 25 以上不工作。

Intent share = new Intent("android.intent.action.SEND");
                share.setType("image/jpeg");
                share.putExtra("android.intent.extra.STREAM", Uri.parse(this.imgUrl));
                startActivity(Intent.createChooser(share, "via"));

【问题讨论】:

标签: java android


【解决方案1】:

如果 targetSdkVersion 高于 24,则使用Provider 授予访问权限。

创建一个xml文件:res\xml\provider_paths.xml

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

现在在 AndroidManifest.xml 文件中添加一个 Provider

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

并将其替换为您的代码

Intent share = new Intent("android.intent.action.SEND");
            share.setType("image/jpeg");
Uri uri = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID+ ".provider",new File(this.imgUrl));
            share.putExtra("android.intent.extra.STREAM", uri);

            startActivity(Intent.createChooser(share, "via"));

更新

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

【讨论】:

  • 从另一个活动中获取图像 String imgUrl = getIntent().getStringExtra("ImgUrl");然后使用这个uri来share.putExtra("android.intent.extra.STREAM", Uri.parse(this.imgUrl));
  • Uri uri = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID+ ".provider","你的文件路径在这里");在这里我添加了这个 uri 但发生了错误
  • 好的,我得到了您的问题,使用新文件(this.imgUrl),我也更新了我的答案,请投票并接受它是否正确,以便其他开发人员在遇到相同问题时可以使用它。谢谢
  • 只删除.getPath()
  • 未能找到包含 /file:/storage/emulated/0/Folder/IMG_20180812_065154.jpg 的已配置根目录 Uri uri = FileProvider.getUriForFile(ImageDetail.this, BuildConfig.APPLICATION_ID+ "。提供者”,新文件(this.imgUrl));
【解决方案2】:

首先确保您已添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然后使用此代码

Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
Uri imageUri =  Uri.parse(this.imgUrl);                                
share.putExtra(Intent.EXTRA_STREAM, imageUri);
startActivity(Intent.createChooser(share, "Select"));

【讨论】:

  • 我有图像 uri "this.imgUrl" 不是 res/drawable 中的图像。
  • 我有一个图像 uri“this.imgUrl”,而不是 res/drawable 中的图像。我想用这个 uri 分享图片
  • 您更新的代码在 Oreo 8.0 中不起作用。我已经测试过
【解决方案3】:

试试这个:

Intent shareIntent = new Intent();
     shareIntent.setAction(Intent.ACTION_SEND); 
     shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); 
     shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent,getResources().getText(R.string.send_to)));

【讨论】:

    【解决方案4】:

    使用 File Provider 获取 IMAGE URI 并向 意图...

    请仔细遵循这些步骤。android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()此更新自牛轧糖以来已完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多