我在Android应用程序中使用相机时遇到问题
我有一个保存数据的表单,有一个按钮拍照与相机,相机拍摄的图像将以我的形式放在ImageView上。
调用相机意图并将图像放置在
形式中没有问题我的问题是: 在相机应用程序中, 如果我按下后退按钮(返回表格)我的应用程序崩溃。
为什么?
这是调用相机的按钮上的代码
btn_takepic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
}
});
这是我的onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
final EditText et_foto = (EditText) findViewById(R.id.et_foto);
if(requestCode == CAMERA_PIC_REQUEST) {
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
ImageView image = (ImageView) findViewById(R.id.imv_foto);
image.setImageBitmap(thumbnail);
//toastkeun(data.getExtras().get("data").toString());
}
super.onActivityResult(requestCode, resultCode, data);
}
我正在测试真实设备 这是我的logCat
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): FATAL EXCEPTION: main
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.access$2800(ActivityThread.java:125)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.os.Looper.loop(Looper.java:123)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at java.lang.reflect.Method.invokeNative(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at java.lang.reflect.Method.invoke(Method.java:521)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at dalvik.system.NativeStart.main(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): Caused by: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at com.ngimagrid.nigmago.FormAsetTambah.onActivityResult(FormAsetTambah.java:246)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.Activity.dispatchActivityResult(Activity.java:3890)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): ... 11 more
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): FATAL EXCEPTION: main
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.deliverResults(ActivityThread.java:3515)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.access$2800(ActivityThread.java:125)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.os.Looper.loop(Looper.java:123)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.main(ActivityThread.java:4627)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at java.lang.reflect.Method.invokeNative(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at java.lang.reflect.Method.invoke(Method.java:521)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at dalvik.system.NativeStart.main(Native Method)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): Caused by: java.lang.NullPointerException
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at com.ngimagrid.nigmago.FormAsetTambah.onActivityResult(FormAsetTambah.java:246)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.Activity.dispatchActivityResult(Activity.java:3890)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): ... 11 more
从这一行开始,我认为这就是问题......
07-08 16:05:26.187: ERROR/AndroidRuntime(12116): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity {com.ngimagrid.nigmago/com.ngimagrid.nigmago.FormAsetTambah}: java.lang.NullPointerException
没有结果回来了吗? 如何解决这个问题?
感谢
cmiiw
答案 0 :(得分:4)
NullPointerException是由您的代码引起的,假设data.getExtras()。get(“data”)将返回一些内容。这是一个完全未记录的参数,在许多(大多数)设备上将返回null。
如果看起来,你正试图获得一个缩略图,你可以尝试这样的东西,它尝试从已知(对我而言)的方式从Camera Intent的结果中提取缩略图。
Bitmap thumb;
if (data.getData() != null) {
try {
Uri uri = data.getData();
thumb = Images.Thumbnails.getThumbnail(getContentResolver(), Long.parseLong(uri.getLastPathSegment()), Images.Thumbnails.MICRO_KIND, null);
} catch (Exception typeNotSupported) {
}
}
if (thumb == null) {
thumb = (Bitmap) data.getExtras().get("data");
}
}
顺便提一下,我认为还有另一个错误 - 你的onActivityResult也应该测试resultCode是否正常 - 如果用户从相机取消我相信onActivityResult仍然会被调用。
我希望这很有用。
答案 1 :(得分:3)
我认为这不是来自您的应用。您可以尝试在try / catch块中包围整个onActivity结果代码。我认为你正在经历的是一些手机上的相机错误。还尝试尝试在startActivityForResult意图上发送的额外组件的不同组合。
在执行任何操作之前,请始终检查结果代码。如果结果被取消(Activity.RESULT_CANCELED)或ok(Activity.RESULT_OK)
,你不想制作相同的代码还有一个错误,结果没有出现在EXTRA_OUTPUT中(我认为它的名字是这样的),而是它作为一个在intent.getData()中的Uri。额外输出是您提供保存文件的路径,而uri返回通常是保存在默认摄像机位置的图像。你会看到它有点不同。
您没有使用标记atm,但如果您想要图像位置,则应该使用。搜索堆栈以获取额外的一些示例代码。
答案 2 :(得分:2)
是的,您可以通过这种方式在画廊或相机或任何其他方式处理后退按钮。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode != RESULT_OK)
{
//Here you can handle,do anything you want
}
//other code
}
答案 3 :(得分:0)
你在谈论我知道的YouTube视频时,我遇到了同样的错误。
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try
{
Button btn = (Button) findViewById(R.id.takePhoto);
btn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 0);
}
});
iv = (ImageView) findViewById(R.id.imageView);
}
catch (Exception e)
{
e.printStackTrace();
}
}
答案 4 :(得分:0)
我认为可以通过一个简单的技巧来解决
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==0)
{
return;
}