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