Когда я пытаюсь получить Uri из фотографии, сделанной камерой, я получаю ноль - PullRequest
2 голосов
/ 19 марта 2012

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

Для запуска приложения камеры

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);
   }
});

для получения изображения

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 всегда имеет значение NULL, когда активность возвращается. Спасибо.

Ответы [ 2 ]

10 голосов
/ 19 марта 2012

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");
    }
}
0 голосов
/ 19 марта 2012

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

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

См. onCreate и onSaveInstanceState .

Единственное объяснение, которое у меня есть, относительно того, почему нативное приложение делает это, в то время как какое-либо стороннее приложение камеры не будет каким-то образом нативным, потребляющим ресурсы в той степени, в которой ваша деятельность действительно будет уничтожена, уничтожив ваш outputFileUri.

Может также стоить взглянуть на код результата, возвращенный в onActivityResult, чтобы убедиться, что намерение камеры говорит «ОК», в дополнение к проверке uri / filepath, чтобы увидеть, что изображение действительно было получено. Могу поспорить, что сделал.

...