Android Bundle extras=data.getExtras()上的java.lang.NullPointerException;
我正在尝试捕获图像并将其保存在gallery中。为此,请在onCreate中创建我的代码Android Bundle extras=data.getExtras()上的java.lang.NullPointerException;,android,android-intent,nullpointerexception,bundle,extras,Android,Android Intent,Nullpointerexception,Bundle,Extras,我正在尝试捕获图像并将其保存在gallery中。为此,请在onCreate中创建我的代码 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg"); imageUri = Uri.fromFile(photo); intent.putExtr
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(photo);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PICTURE);
及
现在我可以捕捉图像了,但在那之后,我得到了一个错误
12-17 15:28:56.090: E/AndroidRuntime(4684): FATAL EXCEPTION: main
12-17 15:28:56.090: E/AndroidRuntime(4684): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=null} to activity {com.example.fashiongirl/com.example.fashiongirl.HomeActivity}: java.lang.NullPointerException
12-17 15:28:56.090: E/AndroidRuntime(4684): at android.app.ActivityThread.deliverResults(ActivityThread.java:2744)
12-17 15:28:56.090: E/AndroidRuntime(4684): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2787)
12-17 15:28:56.090: E/AndroidRuntime(4684): at android.app.ActivityThread.access$2000(ActivityThread.java:122)
12-17 15:28:56.090: E/AndroidRuntime(4684): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1032)
12-17 15:28:56.090: E/AndroidRuntime(4684): at android.os.Handler.dispatchMessage(Handler.java:99)
12-17 15:28:56.090: E/AndroidRuntime(4684): at android.os.Looper.loop(Looper.java:132)
12-17 15:28:56.090: E/AndroidRuntime(4684): at android.app.ActivityThread.main(ActivityThread.java:4025)
12-17 15:28:56.090: E/AndroidRuntime(4684): at java.lang.reflect.Method.invokeNative(Native Method)
12-17 15:28:56.090: E/AndroidRuntime(4684): at java.lang.reflect.Method.invoke(Method.java:491)
12-17 15:28:56.090: E/AndroidRuntime(4684): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
12-17 15:28:56.090: E/AndroidRuntime(4684): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
12-17 15:28:56.090: E/AndroidRuntime(4684): at dalvik.system.NativeStart.main(Native Method)
12-17 15:28:56.090: E/AndroidRuntime(4684): Caused by: java.lang.NullPointerException
12-17 15:28:56.090: E/AndroidRuntime(4684): at com.example.fashiongirl.HomeActivity.onActivityResult(HomeActivity.java:47)
12-17 15:28:56.090: E/AndroidRuntime(4684): at android.app.Activity.dispatchActivityResult(Activity.java:4541)
12-17 15:28:56.090: E/AndroidRuntime(4684): at android.app.ActivityThread.deliverResults(ActivityThread.java:2740)
12-17 15:28:56.090: E/AndroidRuntime(4684): ... 11 more
空指针异常在第行
Bundle extras = data.getExtras();
那么问题出在哪里呢?我认为这是安卓4.0+版的问题 试着移除
File photo = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(photo);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
当您调用捕获意图时。现在,在ActivityResult()上生成的bundle不是NULL
实际上,当您向Camera Intent提供MediaStore.EXTRA_OUTPUT
参数时,Camera应用程序不会使用捆绑数据回调。(我在Android 4.0+中发现了这个问题)
您必须从Uri获取图像文件,并将其设置为MediaStore.EXTRA\u OUTPUT
参数
更新:
或者使用下面的pathFromUri()
方法并传递您设置为camera intent的Uri并获取真实的文件路径,现在不必使用Bundle extras=data.getExtras()代码>
它对我有用------这样试试看
@Override
protected void onActivityResult(int requestCode, int resultCode,
final Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
try {
Uri selectedImage = intent.getData();
bmpSelectedImage = getThumbnail(selectedImage);
set_img_camera.setImageBitmap(bmpSelectedImage);
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是我的解决方案:
Bitmap photo=null;
File file = getTempFile(this);
try {
photo = Media.getBitmap(getContentResolver(), Uri.fromFile(file) );
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (photo == null) // for newest android version +-4.0
{
Uri selectedImage = data.getData();
photo = Media.getBitmap(this.getContentResolver(),
selectedImage);
}
及
只需检查“数据”是否为空。如果为空,则应跳过代码,否则会导致应用程序崩溃
if(data != null){
Bundle extras = data.getExtras();
if (extras.containsKey("data")) {
bitmap = (Bitmap) extras.get("data");
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
// byte[] image = baos.toByteArray();
if (bitmap != null) {
// BitmapFactory.Options options = new
// BitmapFactory.Options();
// options.inSampleSize = 5;
// Bitmap myImage = BitmapFactory.decodeByteArray(image, 0,
// image.length, options);
imageView.setImageBitmap(bitmap);
}
} else {
Toast.makeText(getBaseContext(), "Please capture again", Toast.LENGTH_LONG).show();
}
showPopUpForUpload();
}
这并不是唯一的建议,这是你问题的答案,因为如果我们不是有意通过图像路径,或者是视频,我们会得到数据。所以,以正确的方式尝试它,您一定会在imageviewhere`File photo=new File(Environment.getExternalStorageDirectory(),“Pic.jpg”);`您正在SD卡上创建文件,然后使用photo.getpath()从SD卡获取图像路径以进行发送/上载,而不是uri@ρцσѕρєK-它在Android 4.0+中唯一不起作用。在2.2、2.3中也是一样。我建议您检查这两种情况,如果您的bundle为null,则使用uri;如果您的bundle不为null,则使用bundle。我在一些设备摄像头应用程序中看到,仅将图像存储在DCIM
目录中,而不在Extra
Intent
参数中给出的路径上。好的,谢谢提示
Bitmap photo=null;
File file = getTempFile(this);
try {
photo = Media.getBitmap(getContentResolver(), Uri.fromFile(file) );
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (photo == null) // for newest android version +-4.0
{
Uri selectedImage = data.getData();
photo = Media.getBitmap(this.getContentResolver(),
selectedImage);
}
private File getTempFile(Context context)
final File path = new File(Environment.getExternalStorageDirectory(),
context.getPackageName());
if (!path.exists()) {
path.mkdir();
}
return new File(path, "image.tmp");
}
if(data != null){
Bundle extras = data.getExtras();
if (extras.containsKey("data")) {
bitmap = (Bitmap) extras.get("data");
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
// byte[] image = baos.toByteArray();
if (bitmap != null) {
// BitmapFactory.Options options = new
// BitmapFactory.Options();
// options.inSampleSize = 5;
// Bitmap myImage = BitmapFactory.decodeByteArray(image, 0,
// image.length, options);
imageView.setImageBitmap(bitmap);
}
} else {
Toast.makeText(getBaseContext(), "Please capture again", Toast.LENGTH_LONG).show();
}
showPopUpForUpload();
}