相机意图在索尼电话中引发空指针异常

时间:2014-02-18 08:36:40

标签: android sony android-camera-intent

我想要Camera Intent,除了Sony C2305 [4.2.2]之外,它在其他设备上完美运行。在4.2.2模拟器上测试,完美无缺。

以下是片段。我用来拨打Camera Intent

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 getImagePath();
 intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
 startActivityForResult(intent, REQUEST_CAMERA);

 public void getImagePath()
        {
            File imageDirectory =null;
            String state = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(state)) 
            {
                imageDirectory = new File(Environment.getExternalStorageDirectory().getPath()+"/ABC");
            }
            else
            {
                imageDirectory = new File(SmartConsultant.getApplication().getApplicationContext().getFilesDir().getAbsolutePath());
            }
            imageDirectory.mkdirs();
            File tempFile = new File(imageDirectory, getVideoName()+ AppConstants.EXTENSION); //AppConstants.Extension is .jpg and getVideoName to fetch name of file as per current sys time.
            outputFileUri = Uri.fromFile( tempFile );
            currentFileUri = outputFileUri;
        }

获取活动结果:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
   if (requestCode == REQUEST_CAMERA) {
            if(resultCode == RESULT_OK)
            {
                BitmapFactory.Options btmapOptions = new BitmapFactory.Options();
                btmapOptions.inSampleSize = 2;
                bm = BitmapFactory.decodeFile(currentFileUri.getPath(), btmapOptions);
                NewExpensesActivity.this.data.add(bm);
                imagesAdapter.notifyDataSetChanged();
                    compressedPath = ImageCompression.compressImage(currentFileUri.getPath());//ADDED 10018
                    galleryAddPic();
                    paths.add(compressedPath);//EDITED 10018

            }
        }
          }

但它会在提供结果时抛出Null Pointer Exception Log Cat:

 java.lang.RuntimeException: Unable to resume activity {com.smarthumanoid.com/com.netdoers.com.ui.AddSxActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1001, result=-1, data=Intent { act=inline-data dat=file:///storage/sdcard0/SmartConsultant/20140217194718.jpg typ=image/jpeg (has extras) }} to activity {com.smarthumanoid.com/com.netdoers.com.ui.AddSxActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2899)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2928)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3865)
at android.app.ActivityThread.access$700(ActivityThread.java:156)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1346)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5299)
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:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1001, result=-1, data=Intent { act=inline-data dat=file:///storage/sdcard0/SmartConsultant/20140217194718.jpg typ=image/jpeg (has extras) }} to activity {com.smarthumanoid.com/com.netdoers.com.ui.AddSxActivity}: java.lang.NullPointerException
at android.app.ActivityThread.deliverResults(ActivityThread.java:3488)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2883)
... 13 more
 Caused by: java.lang.NullPointerException
at com.netdoers.com.ui.AddSxActivity.onActivityResult(AddSxActivity.java:485)
at android.app.Activity.dispatchActivityResult(Activity.java:5371)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3484)
... 14 more

2 个答案:

答案 0 :(得分:1)

相机意图

           try {
                Log.d("Main Activity", "Camera");

                String fileName = "temp.jpg";  
                ContentValues values = new ContentValues();  
                values.put(MediaStore.Images.Media.TITLE, fileName);  
                mImageCaptureUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);  

                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
                intent.putExtra(MediaStore.EXTRA_OUTPUT,mImageCaptureUri);  

                startActivityForResult(intent, 2);
            } catch (Exception e) {
                // TODO Auto-generated catch block

            }

<强> onActivityResult

       protected void onActivityResult(final int requestCode,final int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d("Main Activity", "On Activity Result");


    try {
        Uri selectedImage=null;

        if(requestCode == 2 && resultCode == RESULT_OK )
        {

            /* Log.d("Main Activity", "Camera");
              File fi = new File("/sdcard/tmp");
                 try {
                   selectedImage = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), fi.getAbsolutePath(), null, null));
                     if (!fi.delete()) {
                         Log.i("logMarker", "Failed to delete " + fi);
                     }
                 } catch (Exception e) {
                     e.printStackTrace();
                 }*/
            selectedImage=mImageCaptureUri;
            /*          mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),
                       "tmp_avatar_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));
            selectedImage=mImageCaptureUri;*/
        }
        if(selectedImage==null)
        {
            Log.d("Main Activity","Back");
            return;
        }



    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.d("Main Activity","Exception");
        return;
    }      
    return;

}

selectedImage 是Uri的捕获图像,它在Sony手机中运行良好。

答案 1 :(得分:0)

此处,您未在tempFile中提供任何图像名称,因此可以使用SDCard中的该名称保存拍摄的图像。

现在,比如说,图片名称将为123.jpg ....替换此

File tempFile = new File(Environment.getExternalStorageDirectory().getPath()+"/ABC";);

...与

File tempFile = new File(Environment.getExternalStorageDirectory().getPath()+"/ABC/123.jpg");