2014-01-27 3 views
7

по щелчкуПолучить URI от намерения камеры в андроида

takePic.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       Intent m_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       imageUri = getImageUri(); 
       m_intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
       startActivityForResult(m_intent, REQUEST_IMAGE_CAPTURE); 
      } 
     }); 

На Результат:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == REQUEST_IMAGE_CAPTURE 
        && resultCode == RESULT_OK) { 

       Log.d("test1",""+imageUri); 
       Intent shareIntent = new Intent(this, SharePicForm.class); 
       shareIntent.putExtra("photo",""+imageUri); 
       startActivity(shareIntent); 
      } 

     } 

getImageUri()

private Uri getImageUri(){ 
     Uri m_imgUri = null; 
     File m_file; 
     try { 
      SimpleDateFormat m_sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); 
      m_curentDateandTime = m_sdf.format(new Date()); 
      m_imagePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + m_curentDateandTime + ".jpg"; 
      m_file = new File(m_imagePath); 
      m_imgUri = Uri.fromFile(m_file); 
     } catch (Exception p_e) { 
     } 
     return m_imgUri; 
    } 

То, что я хотел бы достичь очень просто, вызов камеры и получить uri результата фото. Но похоже, что существует несовместимое устройство, и на моем устройстве он вообще не работает. Я попытался сохранить путь в общедоступной переменной, но когда я его извлечу, он равен нулю, есть ли формальный и стандартный способ его реализации и должен работать на любом устройстве? Кроме того, есть ли способ не предоставлять настраиваемый путь, но получить путь uri по умолчанию от намерения камеры?

Спасибо за помощь

+4

использовать onSavedInstance() и onRestoreInstanceState() для сохранения и восстановления пути изображения. –

ответ

8

Если устройство не уважает cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,, вы все еще можете использовать

Uri imageUri = data.getData(); 

в onActivityResult(int requestCode, int resultCode, Intent data). Но в большинстве случаев проблема заключается в том, что оперативная память ограничена, и система разрушает вашу активность, чтобы обеспечить достаточное количество памяти для приложения камеры, чтобы выполнить ваши намерения. Поэтому, когда результат возвращается, поля вашей активности не инициализируются, и вы должны следовать предложению Amit и реализовать onSavedInstance() и onRestoreInstanceState().

3

Прежде всего убедитесь, что каталог создан ......

final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+ "/Folder/"; 
    File newdir = new File(dir); 
    newdir.mkdirs(); 

кнопки мыши вызвать эту функцию.

private void capturarFoto() { 
String file = dir+DateFormat.format("yyyy-MM-dd_hhmmss", new Date()).toString()+".jpg"; 


File newfile = new File(file); 
      try { 
       newfile.createNewFile(); 
      } catch (IOException e) {}  

      Uri outputFileUri = Uri.fromFile(newfile); 

      Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

      startActivityForResult(cameraIntent, TAKE_PHOTO_CODE); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) { 
     Log.d("Demo Pic", "Picture is saved"); 


    } 
} 

Убедитесь, что вы добавить разрешение в очевидном

+0

Будет ли этот код работать для телефонов с SDCard и без SDK? –

+1

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

-1

просто используйте этот Uri imageUri = data.getData();

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