1

У меня проблема при тестировании моего приложения на друзей Galaxy S4 (GT i9505, Android 5.1). При предоставлении URI файла для намерения камеры OnActivityResult дает результат Activity.RESULT_OK, а путь - null. Он работает на большинстве других устройств, которые я тестировал (LG G3, nexus 5 ...). Это мой код:Камера Android OnActivityResult сбрасывает путь к фотографии

GetOutputMediaFile

public File getOutputMediaFile(int type){ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), MediaChooserConstants.folderName); 
    if (! mediaStorageDir.exists()){ 
     if (! mediaStorageDir.mkdirs()){ 
      return null; 
     } 
    } 

    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == MediaChooserConstants.MEDIA_TYPE_IMAGE){ 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); 
    } else if(type == MediaChooserConstants.MEDIA_TYPE_VIDEO) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4"); 
    } else { 
     return null; 
    } 
    return mediaFile; 
} 

OnActivityResult

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == Activity.RESULT_OK) { 
     String picturePath = null; 
     if (requestCode == MediaChooserConstants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
      picturePath = fileUri.getPath(); // <--- fileURI is null 
     } 
    } 
} 

DispatchTakePhotoIntent

private void dispatchTakePictureIntent() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File file = Utils.getInstance().getOutputMediaFile(MediaChooserConstants.MEDIA_TYPE_IMAGE); 

    fileUri = Uri.fromFile(file); // create a file to save the image 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name 

    //fileUri is not null here while debugging (../DCIM/.../IMG_XXX.jpg) 
    startActivityForResult(intent, MediaChooserConstants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

} 
+0

Нет необходимости в 'ACTION_IMAGE_CAPTURE', чтобы передать' Uri'. – CommonsWare

ответ

2

вам нужно сохранить путь к файлу расслоению в onSaveInstanceState, а затем получить его снова в onRestoreInstanceState из пучка

2

Сохранить путь изображения, как это:

@Override 
protected void onSaveInstanceState(Bundle savedInstanceState) { 

    if(mImageCaptureUri!=null) 
     savedInstanceState.putString("camera_image", mImageCaptureUri.toString()); 

    super.onSaveInstanceState(savedInstanceState); 
} 

и получить путь к изображению из этого:

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 

    if (savedInstanceState != null) { 
     if (savedInstanceState.containsKey("camera_image")) { 
      mImageCaptureUri = Uri.parse(savedInstanceState.getString("camera_image")); 
     } 
    } 

    super.onRestoreInstanceState(savedInstanceState); 
} 

Эта проблема возникает, только когда пользователь переходит к намерению камеры и к тому времени, когда он захватывает изображение, активность, на которой размещалась камера, уничтожается или воссоздается, когда пользователь возвращается с камеры.

+0

Я попробую, но вы сделали плохую копию/вставку в 'onRestoreInstanceState', снова добавив' URI' в InstanceState. И просто напоминание кому-либо еще, так как я делаю это в фрагменте (не упоминал об этом раньше), фрагменты имеют 'onActivityCreated' вместо' onRestoreInstanceState'. –

+0

Я отредактировал свой ответ в соответствии с Activity. И, как вы сказали, раньше не упоминались «Фрагменты», а также вы являетесь правыми фрагментами 'onActivityCreated' вместо' onRestoreInstanceState'. –

+0

BTW, я не могу проверить на моем устройстве друзей на данный момент, но на моем устройстве (которое работает без сброса uri на null), вызывается 'savedInstanceState', но' onActivityCreated' не вызывается. Это нормальное поведение? –

Смежные вопросы