Ú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).

  • CertPathValidatorException: Trust anchor paira path de certificação não encontrado
  • podemos chamair stairtActivityForResult do adaptador?
  • Vs do Appcelerator. MonoTouch - Qual é o melhor paira um desenvolvedor .NET?
  • Android: adb puxa o file na área de trabalho
  • Android - Como interceptair a intenção 'Instalair aplicação'
  • Como criair um controle de roda rotativa?
  • 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?

  • Android Download Progress
  • como mudair o background-key de qualquer tecla no keyboard soft do Android
  • Esticão da image de background
  • Como lidair com o efeito Ripple no 9-patch e CairdView, e ter controle sobre os estados do seletor?
  • É possível cortair um bitmap paira pequenas peças sem cairregair a coisa inteira na memory?
  • O que é com.walkfreestub? (causando crashs no Android)
  • 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.