Android 位图共享意图

Android 位图共享意图,android,android-intent,bitmap,Android,Android Intent,Bitmap,我正在尝试将整个CardView转换为图像,然后我想使用不同的应用程序共享它 问题 cardView.setDrawingCacheEnabled(true); cardView.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpe

我正在尝试将整个CardView转换为图像,然后我想使用不同的应用程序共享它

问题

cardView.setDrawingCacheEnabled(true);
        cardView.measure(View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED),
                            View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED));
        cardView.layout(0,0, cardView.getMeasuredWidth(), cardView.getMeasuredHeight());
        cardView.buildDrawingCache(true);
        bitmap = Bitmap.createBitmap(cardView.getDrawingCache());
        cardView.setDrawingCacheEnabled(false);
        String path = MediaStore.Images.Media.insertImage(DetailedActivity.this.getContentResolver(),bitmap,"quote",null);
        uri = Uri.parse(path);
问题是,我正在将cardview转换为位图,但在从位图获取uri时,它返回空路径。所以,在转换Uri时,它给出了空指针异常

下面是我提供的权限列表

在上面显示的代码中,它给出了NULL\u指针\u异常

查询

一,。我怎样才能让它工作


二,。有没有其他方法可以做到这一点?

因此,如果我没有弄错,URI路径存储在URI变量中。发生空错误是因为您没有初始化该uri字符串。您可以这样做:

String uri = new String() // -> if there is still an error here, replace String() with String(this) or String(activity_your_name.this)
Intent intent = new Intent(this, activity_output.class); // -> here you add the activity where you send the URI to
intent.putExtra("URI", uri);
在其他活动中,您可以通过以下方式提取URI:

//Getting the URI from previous activity:
path =  getIntent().getExtra("URI");
//Initialising the File form your URI
File StringToBitmap = new File;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
StringToBitmap = new File(path, String.valueOf(options));
//Your bitmap will be stored in mBitmaps
mBitmaps = BitmapFactory.decodeFile(path);
//The next part is extra, if you want to display your bitmap into an ImageView
ImageView iv = new ImageView();
iv = findViewById(R.id.your_id);
iv.setImageBitmap(mBitmaps);
这段代码对我的作用非常类似。关于这个空异常,每次你得到它时,试着看看你是否正确初始化了所有的对象。希望这有帮助。

试试这个:

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

public void onShareImage(Bitmap bitmap) {
    @SuppressLint("SimpleDateFormat") String fileName = "IMG_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".PNG";
    storeScreenShot(bitmap, fileName);
    Uri imgUri = Uri.fromFile(new File(VarName.SCREENSHOT_DIRECTORY + "/" + fileName));

    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());

    Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
    shareIntent.setType("image/*");
    shareIntent.putExtra(Intent.EXTRA_STREAM, imgUri);
    shareIntent.putExtra(Intent.EXTRA_TEXT, VarName.DRESS_ME_SHARE_MASSAGE_HEADER + "\n" + VarName.DRESS_ME_SHARE_APP_LINK);
    startActivity(Intent.createChooser(shareIntent, "Share Image"));
}

public void storeScreenShot(Bitmap bm, String fileName) {

    File dir = new File(VarName.SCREENSHOT_DIRECTORY);
    if (!dir.exists()) {
        dir.mkdirs();
        File file = new File(dir.getAbsolutePath(), ".nomedia");
        try {
            file.createNewFile();
            final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            final Uri contentUri = Uri.fromFile(file);
            scanIntent.setData(contentUri);
            sendBroadcast(scanIntent);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    File file = new File(VarName.SCREENSHOT_DIRECTORY, fileName);
    try {
        FileOutputStream fOut = new FileOutputStream(file);
        bm.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.createNewFile();
        final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        final Uri contentUri = Uri.fromFile(file);
        scanIntent.setData(contentUri);
        sendBroadcast(scanIntent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
现在您只需要调用函数

Bitmap bitmap = getScreenShot(cardView);
onShareImage(bitmap);

它的宽度和高度分别返回1158和304。我猜你搞错了。在每种情况下,我都会得到这些值,但在每种情况下,我也会得到path NULL。
public Bitmap getScreenShot(View view) {
        view.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
        view.setDrawingCacheEnabled(false);
        return bitmap;
    }

public void onShareImage(Bitmap bitmap) {
    @SuppressLint("SimpleDateFormat") String fileName = "IMG_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".PNG";
    storeScreenShot(bitmap, fileName);
    Uri imgUri = Uri.fromFile(new File(VarName.SCREENSHOT_DIRECTORY + "/" + fileName));

    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());

    Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
    shareIntent.setType("image/*");
    shareIntent.putExtra(Intent.EXTRA_STREAM, imgUri);
    shareIntent.putExtra(Intent.EXTRA_TEXT, VarName.DRESS_ME_SHARE_MASSAGE_HEADER + "\n" + VarName.DRESS_ME_SHARE_APP_LINK);
    startActivity(Intent.createChooser(shareIntent, "Share Image"));
}

public void storeScreenShot(Bitmap bm, String fileName) {

    File dir = new File(VarName.SCREENSHOT_DIRECTORY);
    if (!dir.exists()) {
        dir.mkdirs();
        File file = new File(dir.getAbsolutePath(), ".nomedia");
        try {
            file.createNewFile();
            final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            final Uri contentUri = Uri.fromFile(file);
            scanIntent.setData(contentUri);
            sendBroadcast(scanIntent);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    File file = new File(VarName.SCREENSHOT_DIRECTORY, fileName);
    try {
        FileOutputStream fOut = new FileOutputStream(file);
        bm.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.createNewFile();
        final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        final Uri contentUri = Uri.fromFile(file);
        scanIntent.setData(contentUri);
        sendBroadcast(scanIntent);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Bitmap bitmap = getScreenShot(cardView);
onShareImage(bitmap);