Android摄像头导致空指针异常 [英] android camera causing null pointer exception

查看:142
本文介绍了Android摄像头导致空指针异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序都是空指针异常,当它试图拍照和摄像头。 我的应用程序调用相机正是如此:

  //进入相机应用。

        意向意图=新的意图(android.media.action.IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(getTempFile()));

        //开放式摄像头。拍照片。

        startActivityForResult(意向,PIC_ONE);
 

和onresult code是:

  @覆盖
    公共无效onActivityResult(INT申请code,INT结果code,意图数据){
    如果(要求code == PIC_ONE)
            {



                    // prevent空指针
                    如果(data.getData()!= NULL){
                        uri1 = data.getData();
                        文件F =新的文件(getPath(uri1)); //< -NULL指针异常
                        //...do东西
    }
 

此导致空指针的异常,如上所示。 getPath导致此空指针。 getPath()如下所示。 此方法不从mediastore检索图象,它应。

 公共字符串getPath(URI URI){
        的String []投影= {MediaStore.Images.Media.DATA};
        光标光标= managedQuery(URI,投影,NULL,NULL,NULL);
        startManagingCursor(光标);
        如果(光标!= NULL){
            INT与Column_Index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            返回cursor.getString(Column_Index中);
        }
        否则返回NULL;
    }
 

下面是logcat的:

  06-07 22:53:59.650:ERROR / AndroidRuntime(3935):java.lang.RuntimeException的:不提供结果ResultInfo {谁= NULL,请求= 100,结果=  - 1,数据=意向{行为=直列数据DAT =文件:///mnt/sdcard/image.tmp(典型值)=为image / jpeg(有临时演员)}}到活动{com.myapp.myactivity / myactivity.java}:显示java.lang.NullPointerException
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在android.app.ActivityThread.deliverResults(ActivityThread.java:2553)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在android.app.ActivityThread.handleSendResult(ActivityThread.java:2595)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在android.app.ActivityThread.access $ 2000(ActivityThread.java:121)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:973)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在android.os.Handler.dispatchMessage(Handler.java:99)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在android.os.Looper.loop(Looper.java:138)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在android.app.ActivityThread.main(ActivityThread.java:3701)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在java.lang.reflect.Method.invokeNative(本机方法)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在java.lang.reflect.Method.invoke(Method.java:507)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:878)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在dalvik.system.NativeStart.main(本机方法)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):由:显示java.lang.NullPointerException
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在java.io.File.fixSlashes(File.java:205)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在java.io.File.init(File.java:189)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在java.io.File中的< INIT>(File.java:139)
06-07 22:53:59.650:ERROR / AndroidRuntime(3935):在com.myapp.myactivity.java.onActivityResult(myactivity.java:928)
 

但奇怪的是这个程序能正常工作的Xperia X10的,但在较新的手机,包括的Xperia ACRO它有这个空指针。我研究它,它看来问题可能会造成的,因为相机的应用程序是太矮胖,并导致最初的活动来完成。

所以我推翻了这两种方法:

  @覆盖
    保护无效的onSaveInstanceState(包outState){
        super.onSaveInstanceState(outState);
        如果(uri1!= NULL){
            outState.putString(cameraImageUri1,uri1.toString());
        }

    }

    @覆盖
    保护无效onRestoreInstanceState(包savedInstanceState){
        super.onRestoreInstanceState(savedInstanceState);
        如果(savedInstanceState.containsKey(cameraImageUri1)){
            uri1 = Uri.parse(savedInstanceState.getString(cameraImageUri1));
        }


        Log.v(本次活动,呼吁OnR​​estore中......);
    }
 

onRestoreInstanceState从不甚至在拍照和后整理过程调用。所以,我不知道发生了什么。为什么这个空指针被称为

解决方案

 如果(数据!= NULL){
                myfile文件;

                乌里selectedImageUri = data.getData();
                串filemanagerstring = selectedImageUri.getPath();
                字符串selectedImagePath = getPath(selectedImageUri);
                如果(selectedImagePath!= NULL)
                    MYFILE =新的文件(selectedImagePath);
                否则,如果(filemanagerstring!= NULL)
                    MYFILE =新的文件(filemanagerstring);
                 }
 

//这里getPath方法

 公共字符串getPath(URI URI){
        的String []投影= {MediaStore.Images.Media.DATA};
        光标光标= managedQuery(URI,投影,NULL,NULL,NULL);
        如果(光标!= NULL){
            INT与Column_Index =光标
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            返回cursor.getString(Column_Index中);
        } 其他
            返回null;
    }
 

My app has null pointer exceptions when it tries to take a picture and with the camera. My app calls the camera thusly:

        //go to camera app.

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(getTempFile()));

        //open camera. Take picture. 

        startActivityForResult(intent, PIC_ONE);

and the onresult code is:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
    if (requestCode == PIC_ONE)
            {



                    //prevent null pointer
                    if(data.getData()!=null){
                        uri1 = data.getData();
                        File f = new File(getPath(uri1));//<-NULL POINTER EXCEPTION
                        //...do stuff
    }

This causes a nullpointer exception, as shown above. getPath causes this null pointer. getPath() is shown below. This method is not retrieving the image from the mediastore as it should.

public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        startManagingCursor(cursor);
        if(cursor!=null){
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return  cursor.getString(column_index);
        }
        else return null;
    }

Below is the logcat:

    06-07 22:53:59.650: ERROR/AndroidRuntime(3935): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=Intent { act=inline-data dat=file:///mnt/sdcard/image.tmp typ=image/jpeg (has extras) }} to activity {com.myapp.myactivity/myactivity.java}: java.lang.NullPointerException
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2553)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:2595)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at android.app.ActivityThread.access$2000(ActivityThread.java:121)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:973)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at android.os.Looper.loop(Looper.java:138)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at android.app.ActivityThread.main(ActivityThread.java:3701)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at java.lang.reflect.Method.invokeNative(Native Method)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at java.lang.reflect.Method.invoke(Method.java:507)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at dalvik.system.NativeStart.main(Native Method)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935): Caused by: java.lang.NullPointerException
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at java.io.File.fixSlashes(File.java:205)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at java.io.File.init(File.java:189)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at java.io.File.<init>(File.java:139)
06-07 22:53:59.650: ERROR/AndroidRuntime(3935):     at com.myapp.myactivity.java.onActivityResult(myactivity.java:928)

The strange thing is this app works fine on an Xperia X10, but on newer phones including Xperia acro it has this null pointer. I have researched it and it seems the problem could be caused because the camera app is too chunky and causes the initial activity to finish.

So I overrode these two methods:

 @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (uri1 != null) {
            outState.putString("cameraImageUri1", uri1.toString());
        }

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (savedInstanceState.containsKey("cameraImageUri1")) {
            uri1 = Uri.parse(savedInstanceState.getString("cameraImageUri1"));
        }


        Log.v("THIS ACTIVITY","has called onrestore...");
    }

onRestoreInstanceState is never even called during the picture taking and finishing process. So I dont know what is happening. Why is this null pointer being called

解决方案

        if (data != null) {
                File myFile;

                Uri selectedImageUri = data.getData();
                String filemanagerstring = selectedImageUri.getPath();
                String selectedImagePath = getPath(selectedImageUri);
                if (selectedImagePath != null)
                    myFile = new File(selectedImagePath);
                else if (filemanagerstring != null)
                    myFile = new File(filemanagerstring);
                 } 

//here getPath method

public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if (cursor != null) {
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } else
            return null;
    }

这篇关于Android摄像头导致空指针异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆