Share Image File from cache directory Via Intent~android

后端 未结 3 774
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-03 01:27

I am trying to share image file in cache directory, i have the complete path, but not able to send the file in attachments, the code is

File shareImage=Utils         


        
相关标签:
3条回答
  • 2020-12-03 02:10

    what the reason for this?

    As noted, other apps do not have access to your app's internal storage.

    none of them are able to resolve the issue

    Feel free to open a fresh StackOverflow question, where you explain, completely and precisely what specific solutions you have tried and what specific problems you have encountered.

    but that does not seems to be working as per SO post!!!

    Feel free to open a fresh StackOverflow question, where you explain, completely and precisely what "that does not seems to be working" means.

    Or, use FileProvider, which offers this capability with no code required beyond an entry for it in your manifest.

    Or, store your image on external storage, such as getExternalCacheDir().

    0 讨论(0)
  • 2020-12-03 02:15

    I share cached image by followed steps .

    1.Copy your cached image to target path.

    public static File copyImage(String sourcePath, String targetPath){
            try {
                   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);
                   }
                   in.close();
                   out.close();
                   return new File(targetPath);
              } catch (IOException e) {
                   e.printStackTrace();
                   return null;
              }
      }

    2.Get the Uri of copy file.

    Uri uri = Uri.fromFile(target);

    3.Share image by intent

        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);
    
    0 讨论(0)
  • 2020-12-03 02:30

    I followed @CommonsWare's advice and used a FileProvider. Assuming your image is already in the internal cache directory as cache/images/image.png, then you can use the following steps. These are mostly a consolidation of the documentation.

    Set up the FileProvider in the Manifest

    <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>
    

    Replace com.example.myapp with your app package name.

    Create 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>
    

    This tells the FileProvider where to get the files to share (using the cache directory in this case).

    Share the image

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

    Documentation

    • FileProvider
    • Storage Options - Internal Storage
    • Sharing Files
    • Saving Files
    0 讨论(0)
提交回复
热议问题