When i try to get the Uri from a picture taken with the camera i get null

Refresh

November 2018

Views

2.7k time

2

here is my problem, when i try to get the Uri from the picture that I take whit the camera i get null with the camera on emulator and my device, but only whit the system camera if I use another camera app, always works. Here is my code

For launch the camera app

takePic.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    String captured_image = System.currentTimeMillis() + ".jpg";
    File file = new File(Environment.getExternalStorageDirectory(), captured_image); 
    captured_image = file.getAbsolutePath();
    outputFileUri = Uri.fromFile(file); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CAMERA_REQUEST);
   }
});

for get the image

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  if (requestCode == CAMERA_REQUEST) { 
    ContentResolver cr = getContentResolver();
    InputStream in = null;
    try 
    {
        in = cr.openInputStream(outputFileUri); 
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }
  }
}

outputFileUri always have null when the activity returns. Thanks.

2 answers

0

Я думаю, что проблема связана с вашим хозяйствованием из членов вара outputFileUri через стандартный жизненный цикл Android деятельности.

Когда вы звоните StartActivityForResult, ваша деятельность становится остановлена ​​и, вероятно, уничтожены. Когда захват цель возвращается, ваша деятельность получает воссоздана и возобновлялась. Вы, вероятно, нужно быть сохраняющимся значение outputFileUri через те события жизненного цикла.

См OnCreate и onSaveInstanceState .

Только explination меня, почему родное приложение делает это в то время как все, что третья сторона приложение камеры оленья кожа будет быть как-то родное один потребляет ресурсы в той степени, что Ваша деятельность на самом деле разрушаться, уничтожая свой outputFileUri.

Она также может быть стоит посмотреть на ResultCode вернулся в onActivityResult, чтобы убедиться, что намерения камеры говорит OK в дополнение к проверке Ури / путь_к_файлу, чтобы увидеть, что изображение на самом деле попал в плен. Держу пари, это сделал.

10

Android может быть убит (и перезапущен) вашу деятельность , прежде чем попасть onActivityResult, например , потому что вы повернули устройство во время съемки изображения. Попробуйте сохранить и восстановить outputFileUriс остальной частью государственной деятельности ...

protected void onSaveInstanceState(Bundle outState)
{
    outState.putParcelable("outputFileUri", outputFileUri);
}

...

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState != null)
    {
        outputFileUri= savedInstanceState.getParcelable("outputFileUri");
    }
}