Android ACTION_SEND事件:“消息无法上传附件”

时间:2016-01-25 18:28:38

标签: android

我正在尝试实现一个共享按钮,用于捕获屏幕截图并通过标准Android界面共享。我能够创建屏幕截图(我可以在浏览SD卡时看到它),但是当我尝试发送它时,消息应用程序会显示错误:“消息无法上传附件。”

我的代码

File imageDir = new File(Environment.getExternalStorageDirectory(), "inPin");
if(!imageDir.exists()) { imageDir.mkdirs(); }
File closeupImageFile = new File(imageDir, "closeup.png");
File overviewImageFile = new File(imageDir, "overview.png");

View mapView = findViewById(R.id.floor_map);
saveScreenshotToFile(mapView, closeupImageFile);

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(Uri.fromFile(closeupImageFile));

String message = String.format("I'm on %s %s", building.name, getCurrentFloor().name);

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
sendIntent.setType("image/*");
startActivity(Intent.createChooser(sendIntent, "Share via"));

saveScreenshotToFile方法

private static void saveScreenshotToFile(View view, File saveFile) throws IOException {
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache(true);
    Bitmap bitmap = view.getDrawingCache();
    FileOutputStream out = new FileOutputStream(saveFile);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.close();
}

我在模拟器上使用Android Marshmallow,API级别23 - 我不知道这是否有所作为,但我能够在模拟器上使用其他应用程序共享它并且工作正常。

2 个答案:

答案 0 :(得分:6)

您正在发送Intent.FLAG_GRANT_READ_URI_PERMISSION不适用且不应使用的文件URI,如this video及其accompanying blog post中所述。其他应用程序需要存储权限才能访问您的文件。

来自博文:

  

相反,您可以使用URI权限授予其他应用对特定Uris的访问权限。虽然URI权限对file://生成的Uri.fromFile() URI不起作用,但它们适用于与Content Providers关联的Uris。您可以而且应该按照FileProvider中的说明使用 File Sharing Training ,而不是仅为此实现自己。

答案 1 :(得分:0)

如果您必须使用Intent向任何Image发送彩信,请使用此代码。

Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
sendIntent.putExtra("sms_body", "some text"); 
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/image_4.png"));
sendIntent.setType("image/png");
startActivity(sendIntent);

OR

如果您必须使用Intent发送带有音频或视频文件的彩信,请使用此功能。

Intent sendIntent = new Intent(Intent.ACTION_SEND); 
sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
sendIntent.putExtra("address", "1213123123");
sendIntent.putExtra("sms_body", "if you are sending text");   
final File file1 = new File(mFileName);
if(file1.exists()){
  System.out.println("file is exist");
}
Uri uri = Uri.fromFile(file1);
sendIntent.putExtra(Intent.EXTRA_STREAM, uri);
sendIntent.setType("video/*");
startActivity(sendIntent);