Android分享意图仅适用于Google相册,崩溃其他应用

时间:2017-10-25 01:53:11

标签: java android android-intent

我正在尝试为Android应用创建共享意图,以便将图像分享给其他应用。但是,在实现此功能时,我得到的结果非常奇怪。

我有一个分享按钮,当我点击按钮时,它会运行以下方法:

private void shareIntent() {
    Uri currUri = Uri.parse(data.get(pos).getUrl());
    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
    sharingIntent.setAction(Intent.ACTION_SEND);
    sharingIntent.putExtra(Intent.EXTRA_STREAM, currUri);
    sharingIntent.setType("image/jpg");
    startActivity(Intent.createChooser(sharingIntent, getResources().getText(R.string.share_to)));
}

data.get(pos).getUrl()返回我实现Parcelable的自定义类的URL,当打印出来时,它返回如下目录:" / storage / emulated / 0 /Pictures/primitive/Primitive-79538313.jpg"

首先打开共享菜单。但是,当我点击大多数应用程序时,它会导致应用程序崩溃或者出现错误...除了Google照片,它会将照片正确上传到图库。

首先,我想知道我在其他应用中导致此问题的错误。此外,我想知道是否有人解释为什么只有Google相册允许共享功能才能运行,而我测试过的许多其他应用都没有。

供参考,以下是我使用共享意图运行的一些示例。当我尝试分享图片时,它会崩溃环聊。它使得"无法加载图像" Snapchat中的错误消息,"无法共享文件"在Slack和Gmail中,"上传不成功"在Drive中," Messenger无法处理文件" in,well,Messenger,"无法加载图片"在GroupMe中。它不会在Facebook中加载图像,但不会崩溃也不会出错。

感谢您提供的任何帮助或反馈!

修改
这似乎没有试图绕过App Permissions:

 private void shareIntent() {
    File imageFile = new File(data.get(pos).getUrl());
    Uri uriToImage = FileProvider.getUriForFile(
            this, BuildConfig.APPLICATION_ID + ".provider", imageFile);
    Intent shareIntent = ShareCompat.IntentBuilder.from(DetailActivity.this)
            .setStream(uriToImage)
            .getIntent();
    shareIntent.setData(uriToImage);
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    shareIntent.setType("image/jpeg");
    startActivity(Intent.createChooser(shareIntent, "Share image"));
}

感谢所有回复的人!

1 个答案:

答案 0 :(得分:-3)

将您的代码更改为此

private void shareIntent() {
     Intent shareIntent = new Intent(Intent.ACTION_SEND);
     shareIntent.setType("image/jepg");
     shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+data.get(pos).getUrl()));
     startActivity(Intent.createChooser(shareIntent, "Share image"));
}

在您的活动onCreate()

中添加此代码
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());