从caching目录共享图像文件Via Intent〜android

我试图在caching目录共享图像文件,我有完整的path,但不能发送附件中的文件,代码是

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的分享也显示没有图像在后

这是什么原因?

我已经看到了以下的链接如何使用共享图像使用共享意图共享图像在Android和其他许多人都没有能够解决这个问题

PS;

1.目的是将屏幕截图保存在caching目录中,并从那里在线共享

2.是的,我有文件,我可以通过DDMS从设备拉,并在系统上看到。

  • 如何在没有新意图的情况下从通知回到活动
  • 如何将数据传递给android市场在chrome上使用新的scheme?
  • 在Android中:如何从一个服务调用Activity的函数?
  • 请注意Honeycomb或更高版本Android版本的外部USB存储设备的更改
  • 如何将多个文件附加到android中的电子邮件客户端
  • 按下小部件ListView项时的Android启动活动
  • 如何在Android中打开新的屏幕?
  • Android:确定通知是否被用户closures
  • 这是什么原因?

    如上所述,其他应用程序无法访问您的应用程序的内部存储。

    他们中没有人能够解决这个问题

    随意打开一个新的StackOverflow的问题,在那里你解释, 完全和精确的什么具体的解决scheme,你已经尝试过,你遇到了什么具体问题。

    但似乎并没有按照SOpost工作!

    随意打开一个新的StackOverflow问题,在那里你解释, 完全和精确地是什么“似乎没有工作”的意思。

    或者, 使用FileProvider ,它提供了这个function,在你的清单中没有任何需要的代码。

    或者,将图像存储在外部存储上,如getExternalCacheDir()

    我遵循@ CommonsWare的build议,并使用FileProvider。 假设您的映像已经在cache/images/image.png的内部caching目录中,那么您可以使用以下步骤。 这些主要是文件的整合。

    在Manifest中设置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.myappreplace为您的应用程序包名称。

    创buildres / 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在哪里获得文件共享(在这种情况下使用caching目录)。

    分享图像

     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")); } 

    文档

    • FileProvider
    • 存储选项 – 内部存储
    • 共享文件
    • 保存文件

    我按照以下步骤共享caching的图像。

    1.将caching的图像复制到目标path。

    公共静态文件copyImage(stringsourcePath,stringtargetPath){
    尝试{
    InputStream in = new FileInputStream(sourcePath);
    OutputStream out = new FileOutputStream(targetPath);
    byte [] buf = new byte [1024];
    int len;
    while((len = in.read(buf))> 0){
    out.write(buf,0,len);
    }
    附寄();
    out.close();
    返回新的文件(targetPath);
    catch(IOException e){
    e.printStackTrace();
    返回null;
    }
    }

    获取复制文件的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);