从缓存目录中共享图像文件通过Intent~android

时间:2013-09-30 14:05:18

标签: android android-intent share

我正在尝试在缓存目录中共享图像文件,我有完整的路径,但无法在附件中发送文件,代码是

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从设备上取下它,然后在系统上查看。

3 个答案:

答案 0 :(得分:51)

我遵循@ CommonsWare的建议并使用了FileProvider。假设您的图像已作为cache/images/image.png位于内部缓存目录中,则可以使用以下步骤。这些主要是文档的合并。

在清单

中设置FileProvider
<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替换为您的应用包名称。

创建res / xml / filepaths.xml

<?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);