我按照对相机的指令Android开发人员网站
我刚开始的相机意图,而不是建立自己的相机。
示例代码来处理拍摄的照片是如下结果后返回。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Image captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Image saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// Video captured and saved to fileUri specified in the Intent
Toast.makeText(this, "Video saved to:\n" +
data.getData(), Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the video capture
} else {
// Video capture failed, advise user
}
}
}
resultCode
是确定的,但data
始终是NULL,这将导致NPE。 我看着SD卡,照片是真的救了那里。 任何提示? 韩国社交协会很多。
更新:logcat的信息的要求:
01-28 19:39:00.547: ERROR/AndroidRuntime(24315): FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity {com.example.CameraTest/com.example.CameraTest.MyCamera}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.example.CameraTest/com.example.CameraTest.MyCamera}: java.lang.NullPointerException
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2455)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2483)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1997)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3362)
at android.app.ActivityThread.access$700(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1162)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4511)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.example.CameraTest/com.example.CameraTest.MyCamera}: java.lang.NullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:2991)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2442)
... 13 more
Caused by: java.lang.NullPointerException
at com.example.CameraTest.MyCamera.onActivityResult(MyCamera.java:71)
at android.app.Activity.dispatchActivityResult(Activity.java:4654)
at android.app.ActivityThread.deliverResults(ActivityThread.java:2987)
... 14 more
与您的代码的问题是这样的:
data.getData()
这一呼吁并没有得到额外的从返回的关键“数据” Intent
。 它得到现场data
从返回的Intent
这可能是null
。
你需要从返回得到额外的Intent
是这样的:
data.getExtras().get("data");
一些其他的答案都表明这一点,嵌入吨的其他代码。 这使得它很难真正看到的问题是什么。
下面是一个类似的问题的答案 。 看起来这可能与三星手机的问题...
基本上,如果你有这样的代码 ,其创建的意图:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
// start the image capture Intent
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
然后,在onActivityResult
, 更换data.getData()
与fileUri.toString()
它会解决你的问题。
使用@ KJ50的解决方案,并使用savedInstanceState
,以确保你没有得到一个空。
/**
* Here we store the file url as it will be null after returning from camera
* app
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save file url in bundle as it will be null on screen orientation
// changes
outState.putParcelable("file_uri", fileUri);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// get the file url
fileUri = savedInstanceState.getParcelable("file_uri");
}
尝试下面的代码:
Button m_btnCamera; ImageView m_ivCaptureImage; String m_curentDateandTime; String m_imagePath; Bitmap m_bitmap; //Start camera to caputre image. Intent m_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); m_intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri()); startActivityForResult(m_intent, TAKE_PHOTO_CODE); private Uri getImageUri() throws CustomException { Uri m_imgUri = null; File m_file; try { SimpleDateFormat m_sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); m_curentDateandTime = m_sdf.format(new Date()); m_imagePath = File.getPath() + File.separator + m_curentDateandTime + ".jpg"; m_file = new File(m_imagePath); m_imgUri = Uri.fromFile(m_file); } catch (Exception p_e) {} return m_imgUri; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) { m_bitmap = ImageHelper.scaleImage(m_imagePath, 200, 200); m_bitmap = ImageHelper.rotateImage(m_bitmap, true, m_rotate); m_ivCaptureImage.setImageBitmap(m_bitmap); } } }
试试这个
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PICK_IMAGE_ID:
Bitmap bitmap = ImagePicker.getImageFromResult(this.getActivity(), resultCode, data);
if(data!=null){
//set image view
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
此代码将帮助您
在getData()方法返回的数据只有Android版本大于M更新,否则将返回null结果。
if (resultCode == Activity.RESULT_OK) {
//Check Android version, as intent.getData() will return data only if v is above or equal to M otherwise the data will be null
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
Uri selectedImageURI = imageReturnedIntent.getData();
Toast.makeText(getActivity(), "URI Path:" + selectedImageURI, Toast.LENGTH_LONG).show();
} else {
Bitmap photo = (Bitmap) imageReturnedIntent.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), photo, "Title", null);
Uri selectedImageURI = Uri.parse(path);
Toast.makeText(getActivity(), "URI Path:" + selectedImageURI, Toast.LENGTH_LONG).show();
}
}
试试下面这段代码.....
btn_capture.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
});
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
img.setImageBitmap(photo);
}
}
}
然后最后你下面的代码添加到您的清单
<uses-feature android:name="android.hardware.camera"></uses-feature>