2014-09-24 1 views
3

장치 카메라를 호출하는 버튼을 사용하고 있습니다.Android 카메라 : 이미지 데이터를 캡처 할 때 의도가 null을 반환합니다.

private void captureImage() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    fileUri = getOutputMediaFileUri(ImageUtils.MEDIA_TYPE_IMAGE); 

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

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

public Uri getOutputMediaFileUri(int type) { 
    item = ImageUtils.getOutputMediaFile(type, getActivity()); 

    return item.getIcon(); 
} 

및 getOutputMediaFile() 메소드는, 내가 이미지 결과의 onActivityResult를 메서드를 호출 같은 활동에

public static ImageItem getOutputMediaFile(int type, Activity activity) { 

    // External sdcard location 
    File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      IMAGE_DIRECTORY_NAME); 

    // Create the storage directory if it does not exist 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create " 
        + IMAGE_DIRECTORY_NAME + " directory"); 
      return null; 
     } 
    } 

    // Create a media file name 
    Date date = new Date(); 
    String timeStamp = CommonUtils.dateToString(date, "yyyyMMddHHmmss"); 
    String dateString = CommonUtils.dateToString(date, 
      "yyyy/MM/dd HH:mm:ss"); 

    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "IMG_" + timeStamp + ".jpg"); 
    } 

    else { 
     return null; 
    } 

    ImageItem item = new ImageItem(); 
    item.setId(timeStamp); 
    item.setmIcon(Uri.fromFile(mediaFile)); 
    item.setDate(dateString); 
    item.setmSpans(1); 

    // save image in on activity result 

    return item; 
} 

, 다음 내가 가진이 코드를 실행

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

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

     String[] fileColumn = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = getActivity().getContentResolver().query(fileUri, 
       fileColumn, null, null, null); 
     String contentPath = null; 
     if (cursor.moveToFirst()) { 
      contentPath = cursor.getString(cursor 
        .getColumnIndex(fileColumn[0])); 

      horseImage.setImageBitmap(ImageManager 
        .getImage(new ImageManagerRequest(contentPath))); 

     } else if (resultCode == RESULT_CANCELED) { 
      Toast.makeText(getActivity(), "Capture Cancelled", 
        Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(getActivity(), "Capture failed", 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

} 

오류 기록.

09-24 19:17:10.250: E/AndroidRuntime(16995): FATAL EXCEPTION: main 
09-24 19:17:10.250: E/AndroidRuntime(16995): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=198496, result=-1, data=null} to activity {com.eyepax.horseapp/com.eyepax.horseapp.ui.activities.MainActivity}: java.lang.NullPointerException 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.deliverResults(ActivityThread.java:3141) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.access$1100(ActivityThread.java:130) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.os.Looper.loop(Looper.java:137) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.main(ActivityThread.java:4745) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at java.lang.reflect.Method.invokeNative(Native Method) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at java.lang.reflect.Method.invoke(Method.java:511) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at dalvik.system.NativeStart.main(Native Method) 
09-24 19:17:10.250: E/AndroidRuntime(16995): Caused by: java.lang.NullPointerException 
09-24 19:17:10.250: E/AndroidRuntime(16995): at com.eyepax.horseapp.ui.activities.AddHorseBasicInfo.onActivityResult(AddHorseBasicInfo.java:270) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:167) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.Activity.dispatchActivityResult(Activity.java:5192) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.deliverResults(ActivityThread.java:3137) 
09-24 19:17:10.250: E/AndroidRuntime(16995): ... 11 more 

fileUri는 전역 변수입니다. 나는 많은 예제를 거치지 만 문제는 해결할 수 없습니다. Intent 데이터가 null.then이되어서 이런 일이 발생하는 많은 예제는 onActivityResult를 다음과 같이 변경했지만 탈출구입니다.

if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && resultCode == RESULT_OK 
      && null != data) {} 

이 문제를 해결하는 데 도움을주세요.

+0

누군가가 오류 – user3800832

답변

0

이미지의 열린 우리당이 오래된 프로젝트에서

onActivityResult를

에 data.getData()에 포함되어야하며, 또한 이것을 사용이 많은 장치에서 발생

public static Uri getLastPhoto(Context context) { 
    String[] columns = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DATE_ADDED}; 

    ContentResolver cr = context.getContentResolver(); 
    Cursor cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, 
      MediaStore.MediaColumns.DATE_ADDED + " DESC"); 

    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    String path = cursor.getString(columnIndex); 

    cursor.close(); 

    return Uri.fromFile(new File(path)); 
} 
+0

이 어디인지 식별 ​​할 수있는 다른 해결책이 있지만 데이터가 null이되는 경우. – user3800832

+0

내 함수 getLastPhoto를 사용하십시오. –

0

합니다. 일부 OS 문제 때문입니다. 저장하려는 이미지의 이름을 전달하고이를 사용하여 검색하는 것이 좋습니다.

capturedImagePath = MyApplication.cameraImageDirectory + "/camera" 
       + num + ".png"; 
     File mFileTemp = new File(capturedImagePath); 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     try { 
      Uri mImageCaptureUri = null; 
      String state = Environment.getExternalStorageState(); 
      mImageCaptureUri = Uri.fromFile(mFileTemp); 
      intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, 
        mImageCaptureUri); 
      intent.putExtra("return-data", true); //$NON-NLS-1$ 
      startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE); 
     } catch (ActivityNotFoundException e) { 

      Log.d("camera fieldtip", "cannot take picture", e); //$NON-NLS-1$ 
     } 
관련 문제