通过ACTION_SEND共享当前视图而不将图像存储在android中

时间:2017-01-05 20:10:25

标签: java android share android-permissions android-sharing

我想使用ACTION_SEND分享应用的当前视图。

将当前视图转换为位图并将其存储在外部存储器中以将位图转换为可解析的Uri的方法需要权限。

段:

    public static Bitmap getScreenShot(View view) {
        View screenView = view.getRootView();
        screenView.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
        screenView.setDrawingCacheEnabled(false);
        return bitmap;
    }

    // View to BitMap
    Bitmap b  = getScreenShot(getWindow().getDecorView().findViewById(android.R.id.content));

    //BitMap to Parsable Uri (needs write permissions)
    String pathofBmp = MediaStore.Images.Media.insertImage(getContentResolver(), b,"title", null);
    Uri bmpUri = Uri.parse(pathofBmp);

    //Share the image
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
    shareIntent.setType("image/jpeg");
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(Intent.createChooser(shareIntent, "send"));

这需要 WRITE_EXTERNAL_STORAGE 权限, 有没有办法在不将其存储在Android上的外部存储(没有权限)的情况下执行相同的操作?

1 个答案:

答案 0 :(得分:2)

如果minSdkVersion为19或更高,则可以使用getExternalFilesDir()将图像写入外部存储空间并避免权限问题。

您可以将文件写入内部存储空间(例如getCacheDir()),然后使用FileProvider进行共享。无论如何,您需要使用FileProvider或某些ContentProvider作为Android 7.0+ does not like the file scheme

如果您想避免磁盘I / O ......您必须将Bitmap压缩为ByteArrayOutputStream,然后编写自己的ContentProvider以便从byte[]进行投放1}}。这有点冒险,因为如果您的流程在其他应用程序尝试使用Uri之前终止,那么您运气不好,因为您的位图已经消失。