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

Sharing current view via ACTION_SEND without storing the image in android

我想使用 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?

上不将其存储在外部存储中(没有权限)来执行相同的操作?

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

您可以将文件写入内部存储器(例如getCacheDir()),然后使用FileProvider分享。无论如何,您需要使用 FileProvider 或一些 ContentProvider,如 Android 7.0+ does not like the file scheme.

如果你想避开磁盘 I/O...你必须将 Bitmap 压缩成 ByteArrayOutputStream,然后写你自己的 ContentProvider 来服务从那个 byte[]。这有点冒险,因为如果您的进程在其他应用程序结束尝试使用 Uri 之前终止,那么您就不走运了,因为您的位图已经消失了。