2017-06-17 67 views
0

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

我MainActivtiy

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) 

我希望我们能解决这个问题。 非常感谢你:)

+0

请把@DanyPoplawec我已经添加了例外的例外 –

+0

的堆栈跟踪:) – Tommy

回答

0

如果getDrawingCache总是returning 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; 
} 
+0

遗憾的是它不工作。它说:“java.lang.NullPointerException:尝试从字段'int android.view.ViewGroup $ LayoutParams.width'读取空对象引用”。但是我绘制的位图显示在视图中。我只想分享它在存储.... – Tommy

+0

现在我使用onResume()方法中的所有,并且宽度和高度不再为空 – Tommy