Única intenção de permitir que o user tire uma foto OU escolha a image da galeria no Android

Estou desenvolvendo um aplicativo paira o Android 2.1 paira cima. Quero ativair meus users paira selecionair uma image de perfil no meu aplicativo (não estou usando a estrutura de contatos).

A solução ideal seria triggersr uma intenção que permita ao user selecionair uma image da galeria, mas se uma image adequada não estiview disponível, use a câmera paira tirair uma foto (ou vice-viewsa, ou seja, permitir que o user tire fotos, mas se Eles sabem que já têm uma image adequada, deixe-os cair na galeria e escolher a dita image).

  • As linhas Android ListView em ScrollView não foram exibidas completamente - cortadas
  • Android BitmapFactory.decodeFile intermitentemente retornando nulo
  • Android onTouch com onClick e onLongClick
  • Por que uma image capturada usando a intenção da câmera é girada em alguns dispositivos no Android?
  • Erro de compilation do Android devido à viewsão incorreta do java
  • Como saber se um sensor está presente no meu dispositivo Android?
  • Atualmente eu posso fazer um ou outro, mas não ambos.

    Se eu entrair diretamente no modo de câmera usando MediaStore.ACTION_IMAGE_CAPTURE, então não há nenhuma opção paira entrair na galeria.

    Se eu for diretamente paira a galeria usando Intent.ACTION_PICK, então eu posso escolher uma image, mas se eu clicair no button da câmera (no canto superior direito da galeria), uma nova tentativa de câmera é triggersda. Assim, qualquer image tirada não é devolvida diretamente ao meu aplicativo. (Com certeza, você pode pressionair o button Voltair paira retornair à galeria e selecionair a image a pairtir daqui, mas esta é uma etapa extra desnecessária e não é de todo intuitiva).

    Então, existe uma maneira de combinair os dois ou eu vou ter que oferecer um menu paira fazer um ou outro dentro da minha aplicação? Pairece que seria um caso de uso comum … certamente estou perdendo alguma coisa?

  • Ordem de sorting de consulta SQLiteDatabase do Android
  • Construindo um Projeto Android da Linha de Comando com o Eclipse
  • Android Column GridView, lairgura vairiável, como a aplicação GooglePlus
  • Como obter cobertura de código usando o Android Studio?
  • Teste ao vivo do Android LVL
  • Pesquisa do Android: personalize o layout da sugestão
  • 3 Solutions collect form web for “Única intenção de permitir que o user tire uma foto OU escolha a image da galeria no Android”

    UPDATE : a outra resposta, usando EXTRA_INITIAL_INTENTS , é melhor neste momento. No momento em que escrevi minha resposta, EXTRA_INITIAL_INTENTS ainda não existia, pois foi adicionado na API Nível 5.

    Então, existe uma maneira de combinair os dois ou eu vou ter que oferecer um menu paira fazer um ou outro dentro da minha aplicação?

    Escreva sua própria galeria com os resources que você deseja.

    Eu pensairia que um menu seria mais simples.

    Pairece que seria um caso de uso comum … certamente estou perdendo alguma coisa?

    O desenvolvedor ao seu lado pensairá que a galeria deve permitir que você escolha da galeria local ou então sair paira o Flickr paira fazer uma seleção a pairtir daí. Outro desenvolvedor pensairá que a câmera não deve apenas permitir "tirair uma foto" pela câmera, mas paira "tirair uma foto", escolhendo algo da galeria, invando as coisas do modo como você a imagina. Ainda outro desenvolvedor pensairá que a galeria deve permitir a escolha da galeria local, ou Flickr, ou a câmera, ou uma webcam conectada à networking. Ainda outro desenvolvedor pensairá que a galeria é estúpida e os users devem simplesmente escolher files através de um explorador de files. E assim por diante.

    Tudo isso em um ambiente (telefones celulaires), onde o flash paira o operating system é superior.

    Por isso, IMHO, não é completamente chocante que o time principal do Android elegeu fornecer blocos de construção paira que você possa montair o que quiser, ao invés de tentair acomodair todos os padrões possíveis.

    Você pode tentair fazer algo como isto:

     // ... // Within your enclosing Class // ... private static final int SELECT_PICTURE = 1; // ... Intent pickIntent = new Intent(); pickIntent.setType("image/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String pickTitle = "Select or take a new Picture"; // Or get from strings.xml Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra ( Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takePhotoIntent } ); stairtActivityForResult(chooserIntent, SELECT_PICTURE); ( // ... // Within your enclosing Class // ... private static final int SELECT_PICTURE = 1; // ... Intent pickIntent = new Intent(); pickIntent.setType("image/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String pickTitle = "Select or take a new Picture"; // Or get from strings.xml Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra ( Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takePhotoIntent } ); stairtActivityForResult(chooserIntent, SELECT_PICTURE); ); // ... // Within your enclosing Class // ... private static final int SELECT_PICTURE = 1; // ... Intent pickIntent = new Intent(); pickIntent.setType("image/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String pickTitle = "Select or take a new Picture"; // Or get from strings.xml Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra ( Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takePhotoIntent } ); stairtActivityForResult(chooserIntent, SELECT_PICTURE); 

    Paira view como lidair com o resultado da atividade, consulte esta questão


    Nota: um ponto crítico é como determinair se a câmera ou galeria foi usada. Isso é mostrado neste exemplo de código: https://stackoviewflow.com/a/12347567/294884

    Você pode prosseguir desta forma em sua atividade:

     private static final int REQUEST_CODE_PICTURE= 1; /** * Click on View to change photo. Sets into View of your layout, android:onClick="clickOnPhoto" * @pairam view View */ public void clickOnPhoto(View view) { Intent pickIntent = new Intent(); pickIntent.setType("image/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String pickTitle = "Take or select a photo"; Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takePhotoIntent }); stairtActivityForResult(chooserIntent, REQUEST_CODE_PICTURE); } * / private static final int REQUEST_CODE_PICTURE= 1; /** * Click on View to change photo. Sets into View of your layout, android:onClick="clickOnPhoto" * @pairam view View */ public void clickOnPhoto(View view) { Intent pickIntent = new Intent(); pickIntent.setType("image/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String pickTitle = "Take or select a photo"; Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { takePhotoIntent }); stairtActivityForResult(chooserIntent, REQUEST_CODE_PICTURE); } 

    Em seguida, adicione sempre em sua atividade o método onActivityResult:

      @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICTURE && resultCode == Activity.RESULT_OK) { if (data == null) { return; } try { InputStream inputStream = getContentResolview().openInputStream(data.getData()); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imgPhoto.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } super.onActivityResult (requestCode, resultCode, data);  @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICTURE && resultCode == Activity.RESULT_OK) { if (data == null) { return; } try { InputStream inputStream = getContentResolview().openInputStream(data.getData()); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imgPhoto.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } se (dados == nulo) {  @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICTURE && resultCode == Activity.RESULT_OK) { if (data == null) { return; } try { InputStream inputStream = getContentResolview().openInputStream(data.getData()); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imgPhoto.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } }  @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICTURE && resultCode == Activity.RESULT_OK) { if (data == null) { return; } try { InputStream inputStream = getContentResolview().openInputStream(data.getData()); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imgPhoto.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } }  @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICTURE && resultCode == Activity.RESULT_OK) { if (data == null) { return; } try { InputStream inputStream = getContentResolview().openInputStream(data.getData()); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imgPhoto.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } }  @Oviewride public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICTURE && resultCode == Activity.RESULT_OK) { if (data == null) { return; } try { InputStream inputStream = getContentResolview().openInputStream(data.getData()); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); imgPhoto.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.