我正在尝试实现一个共享按钮,用于捕获屏幕截图并通过标准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"));
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 - 我不知道这是否有所作为,但我能够在模拟器上使用其他应用程序共享它并且工作正常。
答案 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);