Autoriser l’utilisateur à sélectionner une caméra ou une galerie pour l’image

Ce que j’essaye de faire semble très simple, mais après quelques jours de recherche, je n’arrive pas à comprendre.

J’ai une application qui permet à l’utilisateur de sélectionner plusieurs images (jusqu’à 5). J’utilise un ImageView . Lorsque l’utilisateur clique sur ImageView , je voudrais lui donner la possibilité de

  1. Sélectionnez l’image de la galerie ou
  2. Utilisez l’appareil photo pour capturer une image.

J’ai commencé par utiliser l’intention ACTION_GET_CONTENT , et cela fonctionne bien pour accéder à la galerie. J’ai donc essayé d’utiliser l’intention ACTION_PICK_ACTIVITY pour permettre à l’utilisateur de choisir une caméra ou une galerie:

 Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); Intent gallIntent=new Intent(Intent.ACTION_GET_CONTENT); gallIntent.setType("image/*"); Intent camIntent = new Intent("android.media.action.IMAGE_CAPTURE"); pickIntent.putExtra(Intent.EXTRA_INTENT, camIntent); pickIntent.putExtra(Intent.EXTRA_INTENT, gallIntent) pickIntent.putExtra(Intent.EXTRA_TITLE, "Select Source"); startActivityForResult(pickIntent, IMAGE_SELECTOR); 

Mais il semble que je ne peux append qu’un EXTRA_INTENT . Le menu apparaît comme prévu, mais les seules options sont Galerie et Fichiers …. Pas de caméra).

Y a-t-il un moyen plus facile / plus facile de faire cela, ce qui me manque? Merci pour toute aide.

Vous devrez créer votre propre boîte de dialog de sélection en fusionnant les deux résultats de résolution d’intention.

Pour ce faire, vous devrez interroger PackageManager avec PackageManager.queryIntentActivities () pour les deux intentions d’origine et créer la liste finale des intentions possibles avec une nouvelle intention pour chaque activité extraite comme ceci:

 List yourIntentsList = new ArrayList(); List listCam = packageManager.queryIntentActivities(camIntent, 0); for (ResolveInfo res : listCam) { final Intent finalIntent = new Intent(camIntent); finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); yourIntentsList.add(finalIntent); } List listGall = packageManager.queryIntentActivities(gallIntent, 0); for (ResolveInfo res : listGall) { final Intent finalIntent = new Intent(gallIntent); finalIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); yourIntentsList.add(finalIntent); } 

(Je l’ai écrit directement ici, donc cela ne peut pas se comstackr)

Ensuite, pour plus d’informations sur la création d’une boîte de dialog personnalisée à partir d’une liste, consultez https://developer.android.com/guide/topics/ui/dialogs.html#AlertDialog

Comment lancer un seul objective pour sélectionner des images de la galerie ou de l’appareil photo, ou de toute application enregistrée pour parcourir le système de fichiers.

Plutôt que de créer une boîte de dialog avec une liste d’options, il est préférable d’utiliser Intent.createChooser pour accéder aux icons graphiques et aux noms abrégés des différentes applications de navigateur “Camera”, “Gallery” et même de tiers. tels que «Astro», etc.

Cela décrit comment utiliser l’intention du sélecteur standard et append des intentions supplémentaires à cela.

 private Uri outputFileUri; private void openImageIntent() { // Determine Uri of camera image to save. final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator); root.mkdirs(); final Ssortingng fname = Utils.getUniqueImageFilename(); final File sdImageMainDirectory = new File(root, fname); outputFileUri = Uri.fromFile(sdImageMainDirectory); // Camera. final List cameraIntents = new ArrayList(); final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); final PackageManager packageManager = getPackageManager(); final List listCam = packageManager.queryIntentActivities(captureIntent, 0); for(ResolveInfo res : listCam) { final Ssortingng packageName = res.activityInfo.packageName; final Intent intent = new Intent(captureIntent); intent.setComponent(new ComponentName(packageName, res.activityInfo.name)); intent.setPackage(packageName); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); cameraIntents.add(intent); } // Filesystem. final Intent galleryIntent = new Intent(); galleryIntent.setType("image/*"); galleryIntent.setAction(Intent.ACTION_GET_CONTENT); // Chooser of filesystem options. final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); // Add the camera options. chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()])); startActivityForResult(chooserIntent, YOUR_SELECT_PICTURE_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == YOUR_SELECT_PICTURE_REQUEST_CODE) { final boolean isCamera; if (data == null) { isCamera = true; } else { final Ssortingng action = data.getAction(); if (action == null) { isCamera = false; } else { isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); } } Uri selectedImageUri; if (isCamera) { selectedImageUri = outputFileUri; } else { selectedImageUri = data == null ? null : data.getData(); } } } } 

J’ai trouvé ça . En utilisant:

 galleryIntent.setType("image/*"); galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 

pour l’une des intentions montre à l’utilisateur la possibilité de sélectionner «documents» dans Android 4, ce qui m’a semblé très déroutant. A l’aide de cette option, vous affichez l’option ‘gallery’:

 Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

J’avais aussi ce problème et j’ai créé un AlertDialog et utilisé la méthode setItems () avec l’écouteur DialogInterface:

 AlertDialog.Builder getImageFrom = new AlertDialog.Builder(Fotos.this); getImageFrom.setTitle("Select:"); final CharSequence[] opsChars = {getResources().getSsortingng(R.ssortingng.takepic), getResources().getSsortingng(R.ssortingng.opengallery)}; getImageFrom.setItems(opsChars, new android.content.DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { if(which == 0){ Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); }else if(which == 1){ Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, getResources().getSsortingng(R.ssortingng.pickgallery)), SELECT_PICTURE); } dialog.dismiss(); } }); 

J’ai fusionné des solutions pour créer un utilitaire complet permettant de sélectionner une image dans Gallery ou Camera. Ce sont les fonctionnalités de ImagePicker util (également dans une librairie Github ):

  • Intentions fusionnées pour les demandes de galerie et de caméra.
  • Redimensionner les grandes images sélectionnées (ex: 2500 x 1600)
  • Faire pivoter l’image si nécessaire

Capture d’écran:

Intention de départ d'ImagePicker

Edit : Voici un fragment de code permettant d’obtenir un Intent fusionné pour les applications Gallery et Camera. Vous pouvez voir le code complet à ImagePicker util (également dans une librairie Github ):

 public static Intent getPickImageIntent(Context context) { Intent chooserIntent = null; List intentList = new ArrayList<>(); Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePhotoIntent.putExtra("return-data", true); takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(context))); intentList = addIntentsToList(context, intentList, pickIntent); intentList = addIntentsToList(context, intentList, takePhotoIntent); if (intentList.size() > 0) { chooserIntent = Intent.createChooser(intentList.remove(intentList.size() - 1), context.getSsortingng(R.ssortingng.pick_image_intent_text)); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[]{})); } return chooserIntent; } private static List addIntentsToList(Context context, List list, Intent intent) { List resInfo = context.getPackageManager().queryIntentActivities(intent, 0); for (ResolveInfo resolveInfo : resInfo) { Ssortingng packageName = resolveInfo.activityInfo.packageName; Intent targetedIntent = new Intent(intent); targetedIntent.setPackage(packageName); list.add(targetedIntent); } return list; } 

ce code vous aidera, en ce sens qu’il y a deux boutons pour Camera et un autre pour Gallery, et Image sera affiché dans ImageView

https://github.com/siddhpuraamitr/Choisir-Image-From-Gallery-Or-Camera

Pour ceux qui obtiennent une erreur sur 4.4 tout en essayant d’utiliser la sélection d’images, utilisez le code ci-dessous.

Plutôt que de créer une boîte de dialog avec une liste d’options, il est préférable d’utiliser Intent.createChooser pour accéder aux icons graphiques et aux noms abrégés des différentes applications de navigateur “Camera”, “Gallery” et même de tiers. tels que «Astro», etc.

Cela décrit comment utiliser l’intention du sélecteur standard et append des intentions supplémentaires à cela.

 private void openImageIntent(){ // Determine Uri of camera image to save. final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "amfb" + File.separator); root.mkdir(); final Ssortingng fname = "img_" + System.currentTimeMillis() + ".jpg"; final File sdImageMainDirectory = new File(root, fname); outputFileUri = Uri.fromFile(sdImageMainDirectory); // Camera. final List cameraIntents = new ArrayList(); final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); final PackageManager packageManager = getPackageManager(); final List listCam = packageManager.queryIntentActivities(captureIntent, 0); for (ResolveInfo res : listCam){ final Ssortingng packageName = res.activityInfo.packageName; final Intent intent = new Intent(captureIntent); intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); intent.setPackage(packageName); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); cameraIntents.add(intent); } //FileSystem final Intent galleryIntent = new Intent(); galleryIntent.setType("image/"); galleryIntent.setAction(Intent.ACTION_GET_CONTENT); // Chooser of filesystem options. final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); // Add the camera options. chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{})); startActivityForResult(chooserIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) { final boolean isCamera; if (data == null) { isCamera = true; } else { final Ssortingng action = data.getAction(); if (action == null) { isCamera = false; } else { isCamera = action.equals(MediaStore.ACTION_IMAGE_CAPTURE); } } Uri selectedImageUri; if (isCamera) { selectedImageUri = outputFileUri; //Bitmap factory BitmapFactory.Options options = new BitmapFactory.Options(); // downsizing image as it throws OutOfMemory Exception for larger // images options.inSampleSize = 8; final Bitmap bitmap = BitmapFactory.decodeFile(selectedImageUri.getPath(), options); preview.setImageBitmap(bitmap); } else { selectedImageUri = data == null ? null : data.getData(); Log.d("ImageURI", selectedImageUri.getLastPathSegment()); // /Bitmap factory BitmapFactory.Options options = new BitmapFactory.Options(); // downsizing image as it throws OutOfMemory Exception for larger // images options.inSampleSize = 8; try {//Using Input Stream to get uri did the sortingck InputStream input = getContentResolver().openInputStream(selectedImageUri); final Bitmap bitmap = BitmapFactory.decodeStream(input); preview.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } } else if (resultCode == RESULT_CANCELED){ // user cancelled Image capture Toast.makeText(getApplicationContext(), "User cancelled image capture", Toast.LENGTH_SHORT) .show(); } else { // failed to capture image Toast.makeText(getApplicationContext(), "Sorry! Failed to capture image", Toast.LENGTH_SHORT) .show(); } } 

Cela devrait prendre en compte le problème null outputFileUri de Tina:

 private static final Ssortingng STORED_INSTANCE_KEY_FILE_URI = "output_file_uri"; @Override public void onSaveInstanceState( Bundle outState ) { super.onSaveInstanceState( outState ); if ( outputFileUri != null ) { outState.putSsortingng( STORED_INSTANCE_KEY_FILE_URI, outputFileUri.toSsortingng() ); } } @Override public void onViewStateRestored( Bundle savedInstanceState ) { super.onViewStateRestored( savedInstanceState ); if ( savedInstanceState != null ) { final Ssortingng outputFileUriStr = savedInstanceState.getSsortingng( STORED_INSTANCE_KEY_FILE_URI ); if ( outputFileUriStr != null && !outputFileUriStr.isEmpty() ) { outputFileUri = Uri.parse( outputFileUriStr ); } } } 

Remarque: j’utilise ce code dans android.support.v4.app.Fragment vos méthodes remplacées peuvent changer en fonction de la version de fragment / activité que vous utilisez.

Vous pouvez créer une boîte de dialog d’options

Ouvrir la caméra:

 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toSsortingng()); if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) { startActivityForResult(cameraIntent, CAMERA_IMAGE); } 

Ouvrez la galerie:

 if (Build.VERSION.SDK_INT <= 19) { Intent i = new Intent(); i.setType("image/*"); i.setAction(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(i, GALLARY_IMAGE); } else if (Build.VERSION.SDK_INT > 19) { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, GALLARY_IMAGE); } 

Pour obtenir le résultat de la sélection

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == GALLARY_IMAGE) { Uri selectedImageUri = data.getData(); Ssortingng selectedImagePath = getRealPathFromURI(selectedImageUri); } else if (requestCode == CAMERA_IMAGE) { Bundle extras = data.getExtras(); Bitmap bmp = (Bitmap) extras.get("data"); SaveImage(bmp); } } } public Ssortingng getRealPathFromURI(Uri uri) { if (uri == null) { return null; } Ssortingng[] projection = {MediaStore.Images.Media.DATA}; Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getSsortingng(column_index); } return uri.getPath(); } 

Méthode pour enregistrer l’image capturée

  private void SaveImage(final Bitmap finalBitmap) { Thread t = new Thread(new Runnable() { @Override public void run() { Ssortingng root = Environment.getExternalStorageDirectory().toSsortingng(); File myDir = new File(root + "/Captured Images/"); if (!myDir.exists()) myDir.mkdirs(); Ssortingng fname = "/image-" + System.currentTimeMillis() + ".jpg"; File file = new File(myDir, fname); try { FileOutputStream out = new FileOutputStream(file); finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); localImagePath = myDir + fname; } catch (Exception e) { e.printStackTrace(); } } }); t.start(); } 

Résolution d’un problème d’image trop important et éviter de perdre de la mémoire.

  private static final int SELECT_PICTURE = 0; private static final int REQUEST_CAMERA = 1; private ImageView mImageView; private void selectImage() { final CharSequence[] items = {"Take Photo", "Choose from Library", "Cancel"}; AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle("Add Photo!"); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { if (items[item].equals("Take Photo")) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File f = new File(android.os.Environment .getExternalStorageDirectory(), "temp.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); startActivityForResult(intent, REQUEST_CAMERA); } else if (items[item].equals("Choose from Library")) { Intent intent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult( Intent.createChooser(intent, "Select File"), SELECT_PICTURE); } else if (items[item].equals("Cancel")) { dialog.dismiss(); } } }); builder.show(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == REQUEST_CAMERA) { File f = new File(Environment.getExternalStorageDirectory() .toSsortingng()); for (File temp : f.listFiles()) { if (temp.getName().equals("temp.jpg")) { f = temp; break; } } try { Bitmap bm; BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); btmapOptions.inSampleSize = 2; bm = BitmapFactory.decodeFile(f.getAbsolutePath(), btmapOptions); // bm = Bitmap.createScaledBitmap(bm, 70, 70, true); mImageView.setImageBitmap(bm); Ssortingng path = android.os.Environment .getExternalStorageDirectory() + File.separator + "test"; f.delete(); OutputStream fOut = null; File file = new File(path, Ssortingng.valueOf(System .currentTimeMillis()) + ".jpg"); fOut = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut); fOut.flush(); fOut.close(); } catch (Exception e) { e.printStackTrace(); } } else if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); Ssortingng tempPath = getPath(selectedImageUri, this.getActivity()); Bitmap bm; btmapOptions.inSampleSize = 2; BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); bm = BitmapFactory.decodeFile(tempPath, btmapOptions); mImageView.setImageBitmap(bm); } } } public Ssortingng getPath(Uri uri, Activity activity) { Ssortingng[] projection = {MediaStore.MediaColumns.DATA}; Cursor cursor = activity .managedQuery(uri, projection, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); cursor.moveToFirst(); return cursor.getSsortingng(column_index); } 

Ajout de ma solution – Cela vous renverra un rappel, que ce soit depuis la caméra ou depuis la cuisine, parallèlement à l’intention:

 public class ImagePickerManager extends BaseAdapter { private List mApplications; private TreeSet mImageCaptureIntents; private TreeSet mImagePickerIntents; private Context mContext; private final ImagePickerManagerListener listener; private static enum intentType { choosePhoto, takePhoto, unknown; public int getIntValue() { switch (this) { case choosePhoto: return 0; case takePhoto: return 1; case unknown: return 2; } return 0; } } public interface ImagePickerManagerListener { void onChooseImage(Intent intent); void onCaptureImage(Intent intent); } public ImagePickerManager(Context context,ImagePickerManagerListener listenr) { this.mContext = context; this.listener = listenr; mImageCaptureIntents = new TreeSet<>(); mImagePickerIntents = new TreeSet<>(); //Picking photo intent Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); mApplications = mContext.getPackageManager().queryIntentActivities(intent, 0); int index = 0; for (int i = 0; i < mApplications.size(); i++) { mImagePickerIntents.add(index); index++; } //Capture photo intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); List resolveInfoList = mContext.getPackageManager().queryIntentActivities(intent, 0); mApplications.addAll(resolveInfoList); for (int i = 0; i < mApplications.size(); i++) { mImageCaptureIntents.add(index); index++; } } public static void openChooseAndCaptureImageDialog(final Context context, final ImagePickerManagerListener listener) { Log.d("openChooseAndCaptureImageDialog", "enter"); final AlertDialog.Builder builder = new AlertDialog.Builder(context); final ImagePickerManager imagePickerManager = new ImagePickerManager(context,listener); builder.setTitle(context.getString(R.string.image_picker_dialog_box_title)); builder.setAdapter(imagePickerManager, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialoginterface, int i) { ResolveInfo resolveInfo = (ResolveInfo) imagePickerManager.getItem(i); Intent pickerIntent = imagePickerManager.getIntentForPackage(context,resolveInfo,i); switch (imagePickerManager.getIntentType(i)){ case choosePhoto: listener.onChooseImage(pickerIntent); break; case takePhoto: listener.onCaptureImage(pickerIntent); break; case unknown: break; } } }); builder.setCancelable(true); builder.setInverseBackgroundForced(true); AlertDialog dialog = builder.create(); dialog.show(); } private intentType getIntentType(int index) { if (mImageCaptureIntents.contains(index)) { return intentType.takePhoto; } else if(mImagePickerIntents.contains(index)) { return intentType.choosePhoto; } return intentType.unknown; } private Intent getIntentForPackage(Context context, ResolveInfo info,int index) { Intent intent = context.getPackageManager().getLaunchIntentForPackage(info.activityInfo.packageName); ComponentName chosenName = new ComponentName( info.activityInfo.packageName, info.activityInfo.name); intent.setComponent(chosenName); intent.setFlags(Intent.FLAG_ACTIVITY_TASK_ON_HOME); if (mImageCaptureIntents.contains(index)) { intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); } else if(mImagePickerIntents.contains(index)) { intent.setType("image/*"); intent.setAction(Intent.ACTION_PICK); } return intent; } @Override public int getCount() { return mApplications.size(); } @Override public Object getItem(int position) { return mApplications.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ResolveInfo item = mApplications.get(position); if (convertView == null) { TextView applicationTextView = new TextView(mContext); LayoutParams param = new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); applicationTextView.setLayoutParams(param); final int horizontalPadding = (int) FVRGeneralUtils.convertDpToPx(mContext, 15); final int verticalPadding = (int) FVRGeneralUtils.convertDpToPx(mContext, 5); applicationTextView.setPadding(horizontalPadding,verticalPadding, horizontalPadding, verticalPadding); applicationTextView.setGravity(android.view.Gravity.CENTER_VERTICAL); Resources.Theme th = mContext.getTheme(); TypedValue tv = new TypedValue(); if (th.resolveAttribute(android.R.attr.textAppearanceMedium, tv, true)) { applicationTextView.setTextAppearance(mContext, tv.resourceId); } applicationTextView.setMinHeight((int) FVRGeneralUtils.convertDpToPx(mContext, 25)); applicationTextView.setCompoundDrawablePadding((int) FVRGeneralUtils.convertDpToPx(mContext, 7)); convertView = applicationTextView; } TextView textView = (TextView) convertView; textView.setText(item.loadLabel(mContext.getPackageManager())); textView.setCompoundDrawablesWithIntrinsicBounds(item.loadIcon(mContext.getPackageManager()), null, null, null); return textView; } } 

Vous pouvez essayer ceci:

Pour ouvrir la galerie:

 private void browseImage() { try { Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(galleryIntent, GALLERY_IMAGE_PICK); //GALLERY_IMAGE_PICK it is a ssortingng } catch (Exception e) {} } 

Pour ouvrir la caméra:

  private void captureImage() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // start the image capture Intent startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); } 

Ceci est simple en utilisant AlertDialog et Intent.ACTION_PICK

  //camOption is a ssortingng array contains two items (Camera, Gallery) AlertDialog.Builder builder = new AlertDialog.Builder(CarPhotos.this); builder.setTitle(R.ssortingng.selectSource) .setItems(R.array.imgOption, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (which==0) { Intent intent = new Intent(this, CameraActivity.class); startActivityForResult(intent, REQ_CAMERA_IMAGE); } if (which==1) { Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE); } } }); builder.create(); builder.show(); 

Sur la base de la réponse de David, mes deux sous sur la partie onActivityResult() . Il prend en charge les modifications introduites en 5.1.1 et détecte si l’utilisateur a sélectionné une image unique ou multiple dans la bibliothèque.

 private enum Outcome { camera, singleLibrary, multipleLibrary, unknown } /** * Returns a List containing the image uri(s) chosen by the user * * @param data The data intent coming from the onActivityResult() * @param cameraUri The uri that had been passed to the intent when the chooser was invoked. * @return A List, never null. */ public List getPicturesUriFromIntent(Intent data, Uri cameraUri) { Outcome outcome = Outcome.unknown; if (data == null || (data.getData() == null && data.getClipData() == null)) { outcome = Outcome.camera; } else if (data.getData() != null && data.getClipData() == null) { outcome = Outcome.singleLibrary; } else if (data.getData() == null) { outcome = Outcome.multipleLibrary; } else { final Ssortingng action = data.getAction(); if (action != null && action.equals(MediaStore.ACTION_IMAGE_CAPTURE)) { outcome = Outcome.camera; } } // list the uri(s) we got back List uris = new ArrayList<>(); switch (outcome) { case camera: uris.add(cameraUri); break; case singleLibrary: uris.add(data.getData()); break; case multipleLibrary: final ClipData clipData = data.getClipData(); for (int i = 0; i < clipData.getItemCount(); i++) { ClipData.Item item = clipData.getItemAt(i); uris.add(item.getUri()); } break; } return uris; } 

Essayez de cette façon

 final CharSequence[] items = { "Take Photo", "Choose from Library", "Cancel" }; AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("Add Photo!"); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { if (items[item].equals("Take Photo")) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File f = new File(android.os.Environment .getExternalStorageDirectory(), "temp.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); startActivityForResult(intent, REQUEST_CAMERA); } else if (items[item].equals("Choose from Library")) { Intent intent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult( Intent.createChooser(intent, "Select File"), SELECT_FILE); } else if (items[item].equals("Cancel")) { dialog.dismiss(); } } }); builder.show(); 

Ensuite, créez la méthode onactivityresult et faites quelque chose comme ça

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == REQUEST_CAMERA) { File f = new File(Environment.getExternalStorageDirectory() .toSsortingng()); for (File temp : f.listFiles()) { if (temp.getName().equals("temp.jpg")) { f = temp; break; } } try { Bitmap bm; BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); bm = BitmapFactory.decodeFile(f.getAbsolutePath(), btmapOptions); // bm = Bitmap.createScaledBitmap(bm, 70, 70, true); ivImage.setImageBitmap(bm); Ssortingng path = android.os.Environment .getExternalStorageDirectory() + File.separator + "Phoenix" + File.separator + "default"; f.delete(); OutputStream fOut = null; File file = new File(path, Ssortingng.valueOf(System .currentTimeMillis()) + ".jpg"); try { fOut = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.JPEG, 85, fOut); fOut.flush(); fOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } } else if (requestCode == SELECT_FILE) { Uri selectedImageUri = data.getData(); Ssortingng tempPath = getPath(selectedImageUri, MainActivity.this); Bitmap bm; BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); bm = BitmapFactory.decodeFile(tempPath, btmapOptions); ivImage.setImageBitmap(bm); } } } 

Voir ceci http://www.theappguruz.com/blog/android-take-photo-camera-gallery-code-sample

Selon la réponse de David Manpearl
https://stackoverflow.com/a/12347567/7226732

il suffit de modifier onActivityResult () comme

  protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == YOUR_SELECT_PICTURE_REQUEST_CODE) { final boolean isCamera; if (data == null) { isCamera = true; } else { final Ssortingng action = data.getAction(); if (action == null) { isCamera = false; } else { isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); } } Uri selectedImageUri; if (isCamera) { selectedImageUri = fileUri; try { Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri); Toast.makeText(CreateWaterType.this, "Image Saved!", Toast.LENGTH_SHORT).show(); image_view.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); Toast.makeText(CreateWaterType.this, "Failed!", Toast.LENGTH_SHORT).show(); } } else { selectedImageUri = data == null ? null : data.getData(); try { Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri); Toast.makeText(CreateWaterType.this, "Image Saved!", Toast.LENGTH_SHORT).show(); image_view.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); Toast.makeText(CreateWaterType.this, "Failed!", Toast.LENGTH_SHORT).show(); } } } } } 

et définissez la capture ou sélectionnez des images en vue image.

Sélection de la caméra ou de la galerie pour l’image dans Android

J’avais travaillé dur sur Camera Selection ou Picture Selection et créé une classe util pour ce travail. Avec l’utilisation de cette classe, «Choisir une caméra ou une galerie d’images est trop facile», cela n’a pris que 5 à 10 minutes de votre développement.

Étape 1: Ajoutez ces classes dans votre code.

ImagePickerUtils: – http://www.codesend.com/view/f8f7c637716bf1c693d1490635ed49b3/

BitmapUtils: – http://www.codesend.com/view/81c1c2a3f39f1f7e627f01f67be282cf/

ConvertUriToFilePath: – http://www.codesend.com/view/f4668a29860235dd1b66eb419c5a58b5/

MediaUtils: – https://codeshare.io/5vKEMl

Nous devons append ces permissions dans le manifeste:

       

Cette fonction de classe (checkAndRequestPermissions) vérifie automatiquement l’autorisation dans Android-Marshmallow et Android – Nougat.

Étape 2. Appeler une classe de caméra pour lancer une intention de caméra:

  //Create a global veriable . private Uri mCameraUri; private static final int CAMERA_REQUEST_CODE = 100; // Call this function when you wants to select or capture an Image. mCameraUri = ImagePickerUtils.createTakePictureIntent(this, CAMERA_REQUEST_CODE); 

Étape 3: Ajoutez onActivityResult dans votre activité pour recevoir des données de Intent

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { Uri fileUri = ImagePickerUtils.getFileUriOfImage(this, data, mCameraUri); try { Bitmap bitmap = null; if (CAMERA_REQUEST_CODE == requestCode) { bitmap = new BitmapUtils().getDownsampledBitmap(this, fileUri, imageView.getWidth(), imageView.getHeight()); } if (bitmap != null) imageView.setImageBitmap(bitmap); } catch (Exception e) { e.printStackTrace(); } } } 

J’espère que cela vous aidera, si quelqu’un ayant des suggestions pour améliorer ces cours, veuillez append votre commentaire dans les commentaires.