Android 位图始终为空

Android 位图始终为空,android,bitmap,Android,Bitmap,我有一个main活动,该活动包含一个视图。现在,我想通过单击FAB将视图(或者更好地说是图片,视图显示)保存在内部存储器上。问题是应用程序总是会因空指针异常而崩溃。位图或视图的宽度和高度似乎为空 我的主要活动 final FractalView fw = new FractalView(this); fw.invalidate(); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.f

我有一个main活动,该活动包含一个视图。现在,我想通过单击FAB将视图(或者更好地说是图片,视图显示)保存在内部存储器上。问题是应用程序总是会因空指针异常而崩溃。位图或视图的宽度和高度似乎为空

我的主要活动

    final FractalView fw = new FractalView(this);
    fw.invalidate();

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Hier wird im finalen Release ein Screenshot gespeichert.", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();


            storeImage(getScreenViewBitmap(fw));
        }
    });

private void storeImage(Bitmap image) {
    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        Log.d(TAG,
                "Error creating media file, check storage permissions: ");// e.getMessage());
        return;
    }
    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        image.compress(Bitmap.CompressFormat.PNG, 20, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        Log.d(TAG, "File not found: " + e.getMessage());
    } catch (IOException e) {
        Log.d(TAG, "Error accessing file: " + e.getMessage());
    }
}
private Bitmap getScreenViewBitmap(View v) {
    v.setDrawingCacheEnabled(true);
    v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

    v.buildDrawingCache(true);
    Bitmap b = Bitmap.createBitmap(v.getDrawingCache());
    return b;
    //v.setDrawingCacheEnabled(false); // clear drawing cache
}

private  File getOutputMediaFile(){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files");

    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    }
    // Create a media file name

    File mediaFile;
    String mImageName="MI_" +".jpg";
    mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
    return mediaFile;
}
错误

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                            Process: de.hsd.manguli.fractalsapp, PID: 12149
                                                                            java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                                                                                at android.graphics.Bitmap.createBitmap(Bitmap.java:619)
                                                                                at de.hsd.manguli.fractalsapp.MainActivity.getScreenViewBitmap(MainActivity.java:166)
                                                                                at de.hsd.manguli.fractalsapp.MainActivity.access$000(MainActivity.java:34)
                                                                                at de.hsd.manguli.fractalsapp.MainActivity$1.onClick(MainActivity.java:69)
                                                                                at android.view.View.performClick(View.java:4756)
                                                                                at android.view.View$PerformClick.run(View.java:19749)
                                                                                at android.os.Handler.handleCallback(Handler.java:739)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                at android.os.Looper.loop(Looper.java:135)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:5221)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
我希望我们能解决这个问题。
非常感谢:)

如果
getDrawingCache
总是
返回null
: 试试这个:

public static Bitmap loadBitmapFromView(View v) {
     Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
     Canvas c = new Canvas(b);
     v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
     v.draw(c);
     return b;
}

请把你的行李放好exception@DanyPoplawec我添加了例外:)不幸的是,它不起作用。它说:“java.lang.NullPointerException:尝试读取空对象引用上的字段‘int android.view.ViewGroup$LayoutParams.width’”。但我绘制的位图显示在视图中。我只想在存储器中共享它……现在我在onResume()方法中使用all,宽度和高度不再为null