从摄像头,android获取图像时获取nullpointer异常?

时间:2013-12-05 05:43:47

标签: android camera nullpointerexception

我在sony,samsung和HTC设备上测试了我的代码,它运行正常。 但它不适用于像karbonn等其他设备......

这是我的代码

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file

    // start the image capture Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

这是onactivity结果代码

   @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Uri selectedImage = data.getData();
            try {
                String[] filePathColumn = { MediaStore.Images.Media.DATA };
                Cursor cursor = getContentResolver().query(selectedImage,
                        filePathColumn, null, null, null);
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                filePath = cursor.getString(columnIndex);
            } catch (Exception e) {
                filePath = selectedImage.getPath();
            }
            Log.v("log", "filePath is : " + filePath);


        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }
}

这是我得到的异常的logcat

    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {com.pstpl.crime/com.pstpl.crimeverify.VerficationActivity}: java.lang.NullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:2980)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023)
at android.app.ActivityThread.access$1100(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
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:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.NullPointerException
at com.pstpl.crimeverify.VerficationActivity.onActivityResult(VerficationActivity.java:281)
at android.app.Activity.dispatchActivityResult(Activity.java:4662)
at android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
... 11 more

错误在URI中变为null。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我看到你正在提供一个fileUri来保存图像。为什么你不能像这样直接检索它?

Uri selectedImage = fileUri;

答案 1 :(得分:0)

对于从相机捕获图像,请尝试以下代码。

public class CameraPhotoCapture extends Activity {

    final static int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 1;


    Uri imageUri                      = null;
    static TextView imageDetails      = null;
    public  static ImageView showImg  = null;
    CameraPhotoCapture CameraActivity = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera_photo_capture);
        CameraActivity = this;

        imageDetails = (TextView) findViewById(R.id.imageDetails);

        showImg = (ImageView) findViewById(R.id.showImg);

        final Button photo = (Button) findViewById(R.id.photo);



        photo.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

              /*************************** Camera Intent Start ************************/  

                // Define the file-name to save photo taken by Camera activity

                String fileName = "Camera_Example.jpg";

                // Create parameters for Intent with filename

                ContentValues values = new ContentValues();

                values.put(MediaStore.Images.Media.TITLE, fileName);

                values.put(MediaStore.Images.Media.DESCRIPTION,"Image capture by camera");

                // imageUri is the current activity attribute, define and save it for later usage  

                imageUri = getContentResolver().insert(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

                /**** EXTERNAL_CONTENT_URI : style URI for the "primary" external storage volume. ****/


                // Standard Intent action that can be sent to have the camera
                // application capture an image and return it.  

                Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE );

                 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

                 intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

                startActivityForResult( intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

             /*************************** Camera Intent End ************************/


            }    

        });
    }


     @Override
     protected void onActivityResult( int requestCode, int resultCode, Intent data)
        {
            if ( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {

                if ( resultCode == RESULT_OK) {

                   /*********** Load Captured Image And Data Start ****************/

                    String imageId = convertImageUriToFile( imageUri,CameraActivity);


                   //  Create and excecute AsyncTask to load capture image

                    new LoadImagesFromSDCard().execute(""+imageId);

                  /*********** Load Captured Image And Data End ****************/


                } else if ( resultCode == RESULT_CANCELED) {

                    Toast.makeText(this, " Picture was not taken ", Toast.LENGTH_SHORT).show();
                } else {

                    Toast.makeText(this, " Picture was not taken ", Toast.LENGTH_SHORT).show();
                }
            }
        }


     /************ Convert Image Uri path to physical path **************/

     public static String convertImageUriToFile ( Uri imageUri, Activity activity )  {

            Cursor cursor = null;
            int imageID = 0;

            try {

                /*********** Which columns values want to get *******/
                String [] proj={
                                 MediaStore.Images.Media.DATA,
                                 MediaStore.Images.Media._ID,
                                 MediaStore.Images.Thumbnails._ID,
                                 MediaStore.Images.ImageColumns.ORIENTATION
                               };

                cursor = activity.managedQuery(

                                imageUri,         //  Get data for specific image URI
                                proj,             //  Which columns to return
                                null,             //  WHERE clause; which rows to return (all rows)
                                null,             //  WHERE clause selection arguments (none)
                                null              //  Order-by clause (ascending by name)

                             );

                //  Get Query Data

                int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
                int columnIndexThumb = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
                int file_ColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

                //int orientation_ColumnIndex = cursor.
                //    getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION);

                int size = cursor.getCount();

                /*******  If size is 0, there are no images on the SD Card. *****/

                if (size == 0) {


                    imageDetails.setText("No Image");
                }
                else
                {

                    int thumbID = 0;
                    if (cursor.moveToFirst()) {

                        /**************** Captured image details ************/

                        /*****  Used to show image on view in LoadImagesFromSDCard class ******/
                        imageID     = cursor.getInt(columnIndex);

                        thumbID     = cursor.getInt(columnIndexThumb);

                        String Path = cursor.getString(file_ColumnIndex);

                        //String orientation =  cursor.getString(orientation_ColumnIndex);

                        String CapturedImageDetails = " CapturedImageDetails : \n\n"
                                                          +" ImageID :"+imageID+"\n"
                                                          +" ThumbID :"+thumbID+"\n"
                                                          +" Path :"+Path+"\n";

                        // Show Captured Image detail on activity
                        imageDetails.setText( CapturedImageDetails );

                    }
                }    
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }

            // Return Captured Image ImageID ( By this ImageID Image will load from sdcard )

            return ""+imageID;
        }


         /**
         * Async task for loading the images from the SD card.
         *
         * @author Android Example
         *
         */

        // Class with extends AsyncTask class

     public class LoadImagesFromSDCard  extends AsyncTask<String, Void, Void> {

            private ProgressDialog Dialog = new ProgressDialog(CameraPhotoCapture.this);

            Bitmap mBitmap;

            protected void onPreExecute() {
                /****** NOTE: You can call UI Element here. *****/

                // Progress Dialog
                Dialog.setMessage(" Loading image from Sdcard..");
                Dialog.show();
            }


            // Call after onPreExecute method
            protected Void doInBackground(String... urls) {

                Bitmap bitmap = null;
                Bitmap newBitmap = null;
                Uri uri = null;       


                    try {

                        /**  Uri.withAppendedPath Method Description
                        * Parameters
                        *    baseUri  Uri to append path segment to
                        *    pathSegment  encoded path segment to append
                        * Returns
                        *    a new Uri based on baseUri with the given segment appended to the path
                        */

                        uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + urls[0]);

                        /**************  Decode an input stream into a bitmap. *********/
                        bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));

                        if (bitmap != null) {

                            /********* Creates a new bitmap, scaled from an existing bitmap. ***********/

                            newBitmap = Bitmap.createScaledBitmap(bitmap, 170, 170, true);

                            bitmap.recycle();

                            if (newBitmap != null) {

                                mBitmap = newBitmap;
                            }
                        }
                    } catch (IOException e) {
                        // Error fetching image, try to recover

                        /********* Cancel execution of this task. **********/
                        cancel(true);
                    }

                return null;
            }


            protected void onPostExecute(Void unused) {

                // NOTE: You can call UI Element here.

                // Close progress dialog
                  Dialog.dismiss();

                if(mBitmap != null)
                {
                  // Set Image to ImageView  

                   showImg.setImageBitmap(mBitmap);
                }  

            }

        }

}