我正在尝试在缓存目录中共享图像文件,我有完整的路径,但无法在附件中发送文件,代码是
File shareImage=Utils.getBitmapFile();
Log.d("Activity", "get final path in result"+shareImage.getAbsolutePath());
/*MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext=shareImage.getName().substring(shareImage.getName().lastIndexOf(".")+1);
String type = mime.getMimeTypeFromExtension(ext);
shareIntent.setType(type);
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri shareImageUri = Uri.fromFile(shareImage);
Uri shareImageUri = Uri.fromParts("content", shareImage.getAbsolutePath(), null);//("content://"+shareImage.getAbsolutePath());
*/
Uri shareImageUri = Uri.fromFile(shareImage);
Log.d("Result ","uri is "+shareImageUri.toString());
shareIntent.putExtra(Intent.EXTRA_STREAM, shareImageUri);
startActivity(Intent.createChooser(shareIntent, "Share Results"));
以上评论的代码无效
发送邮件显示附件,但没有收到结束没有附件, Facebook分享也在帖子中显示没有图片
这是什么原因??
我已经看到以下SO链接how-to-use-share-image-using-sharing-intent-to-share-images-in-android和其他许多人,他们都没有能够解决问题
P.S。;
1.目的是将屏幕截图保存在缓存目录中并从那里在线共享
2.是的,我确实有文件,我可以通过DDMS从设备上取下它,然后在系统上查看。
答案 0 :(得分:51)
我遵循@ CommonsWare的建议并使用了FileProvider。假设您的图像已作为cache/images/image.png
位于内部缓存目录中,则可以使用以下步骤。这些主要是文档的合并。
<manifest>
...
<application>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.myapp.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
...
</application>
</manifest>
将com.example.myapp
替换为您的应用包名称。
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="shared_images" path="images/"/>
</paths>
这告诉FileProvider在哪里获取要共享的文件(在这种情况下使用缓存目录)。
File imagePath = new File(context.getCacheDir(), "images");
File newFile = new File(imagePath, "image.png");
Uri contentUri = FileProvider.getUriForFile(context, "com.example.app.fileprovider", newFile);
if (contentUri != null) {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri));
shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
startActivity(Intent.createChooser(shareIntent, "Choose an app"));
}
答案 1 :(得分:9)
这是什么原因?
如上所述,其他应用无法访问您应用的内部存储空间。
他们都无法解决问题
随意打开一个新的StackOverflow问题,您可以在其中解释,完全准确地您尝试过哪些具体解决方案以及遇到的具体问题。
但这似乎并没有像SO帖子那样工作!!!
随意打开一个新的StackOverflow问题,在那里你解释,完全和精确“看似不起作用”的意思。
或者,use FileProvider
,它提供此功能,除了清单中的条目之外不需要任何代码。
或者,将图像存储在外部存储设备上,例如getExternalCacheDir()
。
答案 2 :(得分:1)
我按照以下步骤分享缓存图片。
1.将缓存的图像复制到目标路径。
public static File copyImage(String sourcePath,String targetPath){
试试{
InputStream in = new FileInputStream(sourcePath);
OutputStream out = new FileOutputStream(targetPath);
byte [] buf = new byte [1024];
int len;
while((len = in.read(buf))&gt; 0){
out.write(buf,0,len);
}
in.close();
out.close();
返回新文件(targetPath);
} catch(IOException e){
e.printStackTrace();
return null;
}
}
2.获取复制文件的Uri。
Uri uri = Uri.fromFile(target);
3.意图分享图像
File dir = new File(Constant.INKPIC_PATH);//your custom path,such as /mnt/sdcard/Pictures
if(!dir.exists()){
dir.mkdirs();
}
File f = new File(dir,"temporary_file.jpg");
File target = copyImage(url,f.getAbsolutePath());
Uri uri = Uri.fromFile(target);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM,uri );
context.startActivity(intent);