Obtenir / choisir une image à partir de l’application Gallery intégrée à Android

J’essaie d’ouvrir une image / image dans l’application intégrée à Gallery depuis mon application.

J’ai un URI de l’image (l’image se trouve sur la carte SD).

Avez-vous des suggestions?

Ceci est une solution complète. Je viens de mettre à jour cet exemple de code avec les informations fournies dans la réponse ci-dessous par @mad. Vérifiez également la solution ci-dessous à partir de @Khobaib expliquant comment traiter les images picasa.

Mettre à jour

Je viens de passer en revue ma réponse originale et j’ai créé un projet Android Studio simple que vous pouvez commander à partir de github et importer directement sur votre système.

https://github.com/hanscappelle/SO-2169649

(notez que la sélection de fichiers multiples nécessite encore du travail)

Sélection d’image unique

Avec le support des images des explorateurs de fichiers grâce à l’utilisateur fou.

public class BrowsePictureActivity extends Activity { // this is the action code we use in our intent, // this way we know we're looking at the response from our own action private static final int SELECT_PICTURE = 1; private Ssortingng selectedImagePath; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.Button01) .setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // in onCreate or any event where your want the user to // select a file Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); } }); } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); selectedImagePath = getPath(selectedImageUri); } } } /** * helper to resortingeve the path of an image URI */ public Ssortingng getPath(Uri uri) { // just some safety built in if( uri == null ) { // TODO perform some logging or show user feedback return null; } // try to resortingeve the image from the media store first // this will only work for images selected from gallery Ssortingng[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); if( cursor != null ){ int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); Ssortingng path = cursor.getSsortingng(column_index); cursor.close(); return path; } // this is our fallback here return uri.getPath(); } } 

Sélection de plusieurs images

Étant donné que quelqu’un a demandé cette information dans un commentaire et qu’il est préférable de recueillir des informations.

Définissez un paramètre supplémentaire EXTRA_ALLOW_MULTIPLE sur l’intention:

 intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 

Et dans la gestion de la gestion des résultats pour ce paramètre:

 if (Intent.ACTION_SEND_MULTIPLE.equals(data.getAction())) && Intent.hasExtra(Intent.EXTRA_STREAM)) { // resortingeve a collection of selected images ArrayList list = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); // iterate over these images if( list != null ) { for (Parcelable parcel : list) { Uri uri = (Uri) parcel; // TODO handle the images one by one here } } } 

Notez que cela n’est pris en charge que par le niveau API 18+.

Voici une mise à jour du code correct publié par hcpl. mais cela fonctionne avec le gestionnaire de fichiers OI, le gestionnaire de fichiers astro ET la galerie multimédia (testée). donc je suppose que cela fonctionnera avec tous les gestionnaires de fichiers (y a-t-il beaucoup d’autres que ceux mentionnés?). fait quelques corrections au code qu’il a écrit.

 public class BrowsePicture extends Activity { //YOU CAN EDIT THIS TO WHATEVER YOU WANT private static final int SELECT_PICTURE = 1; private Ssortingng selectedImagePath; //ADDED private Ssortingng filemanagerssortingng; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button) findViewById(R.id.Button01)) .setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // in onCreate or any event where your want the user to // select a file Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); } }); } //UPDATED public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); //OI FILE Manager filemanagerssortingng = selectedImageUri.getPath(); //MEDIA GALLERY selectedImagePath = getPath(selectedImageUri); //DEBUG PURPOSE - you can delete this if you want if(selectedImagePath!=null) System.out.println(selectedImagePath); else System.out.println("selectedImagePath is null"); if(filemanagerssortingng!=null) System.out.println(filemanagerssortingng); else System.out.println("filemanagerssortingng is null"); //NOW WE HAVE OUR WANTED STRING if(selectedImagePath!=null) System.out.println("selectedImagePath is the right one for you!"); else System.out.println("filemanagerssortingng is the right one for you!"); } } } //UPDATED! public Ssortingng getPath(Uri uri) { Ssortingng[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); if(cursor!=null) { //HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL //THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getSsortingng(column_index); } else return null; } 

Les méthodes de hcpl fonctionnent parfaitement avant KitKat, mais ne fonctionnent pas avec l’API DocumentsProvider. Pour cela, il suffit de suivre le tutoriel officiel d’Android pour les fournisseurs de documents: https://developer.android.com/guide/topics/providers/document-provider.html -> ouvrir un document, section Bitmap.

J’ai simplement utilisé le code de hcpl et l’ai étendu: si le fichier contenant le chemin d’access à l’image renvoie une exception, j’appelle cette fonction:

 private Bitmap getBitmapFromUri(Uri uri) throws IOException { ParcelFileDescriptor parcelFileDescriptor = getContentResolver().openFileDescriptor(uri, "r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); parcelFileDescriptor.close(); return image; } 

Testé sur Nexus 5.

base avec le code ci-dessus, je reflétais le code comme ci-dessous, peut-être que c’est plus approprié:

 public Ssortingng getPath(Uri uri) { Ssortingng selectedImagePath; //1:MEDIA GALLERY --- query from MediaStore.Images.Media.DATA Ssortingng[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); if(cursor != null){ int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); selectedImagePath = cursor.getSsortingng(column_index); }else{ selectedImagePath = null; } if(selectedImagePath == null){ //2:OI FILE Manager --- call method: uri.getPath() selectedImagePath = uri.getPath(); } return selectedImagePath; } 

J’ai parcouru la solution de @hcpl & @mad. La solution de hcpl prend bien en charge les images locales dans la galerie et fournit une meilleure solution en plus: elle permet également de charger les images OI / Astro / Dropbox. Mais dans mon application, lorsque vous travaillez sur la bibliothèque picasa désormais intégrée à la Galerie Android, les deux solutions échouent.

J’ai cherché et analysé un peu et finalement est venu avec une solution meilleure et élégante qui surmonte cette limitation. Grâce à Dimitar Darazhanski pour son blog, qui m’a aidé dans cette affaire, j’ai modifié un peu pour le rendre plus facile à comprendre. Voici ma solution va –

 public class BrowsePicture extends Activity { //YOU CAN EDIT THIS TO WHATEVER YOU WANT private static final int SELECT_PICTURE = 1; private Ssortingng selectedImagePath; //ADDED private Ssortingng filemanagerssortingng; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button) findViewById(R.id.Button01)) .setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // in onCreate or any event where your want the user to // select a file Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); } }); } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); Log.d("URI VAL", "selectedImageUri = " + selectedImageUri.toSsortingng()); selectedImagePath = getPath(selectedImageUri); if(selectedImagePath!=null){ // IF LOCAL IMAGE, NO MATTER IF ITS DIRECTLY FROM GALLERY (EXCEPT PICASSA ALBUM), // OR OI/ASTRO FILE MANAGER. EVEN DROPBOX IS SUPPORTED BY THIS BECAUSE DROPBOX DOWNLOAD THE IMAGE // IN THIS FORM - file:///storage/emulated/0/Android/data/com.dropbox.android/... System.out.println("local image"); } else{ System.out.println("picasa image!"); loadPicasaImageFromGallery(selectedImageUri); } } } } // NEW METHOD FOR PICASA IMAGE LOAD private void loadPicasaImageFromGallery(final Uri uri) { Ssortingng[] projection = { MediaColumns.DATA, MediaColumns.DISPLAY_NAME }; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if(cursor != null) { cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(MediaColumns.DISPLAY_NAME); if (columnIndex != -1) { new Thread(new Runnable() { // NEW THREAD BECAUSE NETWORK REQUEST WILL BE MADE THAT WILL BE A LONG PROCESS & BLOCK UI // IF CALLED IN UI THREAD public void run() { try { Bitmap bitmap = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), uri); // THIS IS THE BITMAP IMAGE WE ARE LOOKING FOR. } catch (Exception ex) { ex.printStackTrace(); } } }).start(); } } cursor.close(); } public Ssortingng getPath(Uri uri) { Ssortingng[] projection = { MediaColumns.DATA}; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if(cursor != null) { //HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL //THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA cursor.moveToFirst(); int columnIndex = cursor.getColumnIndexOrThrow(MediaColumns.DATA); Ssortingng filePath = cursor.getSsortingng(columnIndex); cursor.close(); return filePath; } else return uri.getPath(); // FOR OI/ASTRO/Dropbox etc } 

Vérifiez-le et laissez-moi savoir s’il y a un problème avec elle. Je l’ai testé et cela fonctionne bien dans tous les cas.

J’espère que cela aidera tout le monde.

En supposant que vous ayez un dossier d’ image dans votre répertoire de carte SD uniquement pour les images.

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); // tells your intent to get the contents // opens the URI for your image directory on your sdcard intent.setType("file:///sdcard/image/*"); startActivityForResult(intent, 1); 

Vous pouvez ensuite décider avec ce que vous souhaitez faire du contenu dans votre activité.

Ceci était un exemple pour récupérer le nom de chemin de l’image, testez-le avec votre code pour vous assurer que vous pouvez gérer les résultats. Vous pouvez modifier le code en fonction de vos besoins.

 protected final void onActivityResult(final int requestCode, final int resultCode, final Intent i) { super.onActivityResult(requestCode, resultCode, i); // this matches the request code in the above call if (requestCode == 1) { Uri _uri = i.getData(); // this will be null if no image was selected... if (_uri != null) { // now we get the path to the image file cursor = getContentResolver().query(_uri, null, null, null, null); cursor.moveToFirst(); Ssortingng imageFilePath = cursor.getSsortingng(0); cursor.close(); } } 

Mon conseil est d’essayer de récupérer correctement les images, je pense que le problème est le contenu de l’access aux images sur la carte SD. Jetez un coup d’œil à Afficher des images sur une carte SD .

Si vous parvenez à le faire fonctionner, probablement par l’exemple en fournissant un fournisseur correct, vous devriez être capable de trouver une solution pour votre code.

Tenez-moi au courant en mettant à jour cette question avec vos progrès. Bonne chance

Ceci est mon retour sur ce sujet, rassemblant toutes les informations ici, ainsi que d’autres questions pertinentes de débordement de stack. Il renvoie les images de certains fournisseurs, tout en gérant les conditions de mémoire insuffisante et la rotation des images. Il supporte la galerie, picasa et les gestionnaires de fichiers, comme la boîte de repository. L’utilisation est simple: en entrée, le constructeur reçoit le résolveur de contenu et l’URI. La sortie est le bitmap final.

 /** * Creates resized images without exploding memory. Uses the method described in android * documentation concerning bitmap allocation, which is to subsample the image to a smaller size, * close to some expected size. This is required because the android standard library is unable to * create a reduced size image from an image file using memory comparable to the final size (and * loading a full sized multi-megapixel picture for processing may exceed application memory budget). */ public class UserPicture { static int MAX_WIDTH = 600; static int MAX_HEIGHT = 800; Uri uri; ContentResolver resolver; Ssortingng path; Masortingx orientation; int storedHeight; int storedWidth; public UserPicture(Uri uri, ContentResolver resolver) { this.uri = uri; this.resolver = resolver; } private boolean getInformation() throws IOException { if (getInformationFromMediaDatabase()) return true; if (getInformationFromFileSystem()) return true; return false; } /* Support for gallery apps and remote ("picasa") images */ private boolean getInformationFromMediaDatabase() { Ssortingng[] fields = { Media.DATA, ImageColumns.ORIENTATION }; Cursor cursor = resolver.query(uri, fields, null, null, null); if (cursor == null) return false; cursor.moveToFirst(); path = cursor.getSsortingng(cursor.getColumnIndex(Media.DATA)); int orientation = cursor.getInt(cursor.getColumnIndex(ImageColumns.ORIENTATION)); this.orientation = new Masortingx(); this.orientation.setRotate(orientation); cursor.close(); return true; } /* Support for file managers and dropbox */ private boolean getInformationFromFileSystem() throws IOException { path = uri.getPath(); if (path == null) return false; ExifInterface exif = new ExifInterface(path); int orientation = exif.getAtsortingbuteInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); this.orientation = new Masortingx(); switch(orientation) { case ExifInterface.ORIENTATION_NORMAL: /* Identity masortingx */ break; case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: this.orientation.setScale(-1, 1); break; case ExifInterface.ORIENTATION_ROTATE_180: this.orientation.setRotate(180); break; case ExifInterface.ORIENTATION_FLIP_VERTICAL: this.orientation.setScale(1, -1); break; case ExifInterface.ORIENTATION_TRANSPOSE: this.orientation.setRotate(90); this.orientation.postScale(-1, 1); break; case ExifInterface.ORIENTATION_ROTATE_90: this.orientation.setRotate(90); break; case ExifInterface.ORIENTATION_TRANSVERSE: this.orientation.setRotate(-90); this.orientation.postScale(-1, 1); break; case ExifInterface.ORIENTATION_ROTATE_270: this.orientation.setRotate(-90); break; } return true; } private boolean getStoredDimensions() throws IOException { InputStream input = resolver.openInputStream(uri); Options options = new Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeStream(resolver.openInputStream(uri), null, options); /* The input stream could be reset instead of closed and reopened if it were possible to reliably wrap the input stream on a buffered stream, but it's not possible because decodeStream() places an upper read limit of 1024 bytes for a reset to be made (it calls mark(1024) on the stream). */ input.close(); if (options.outHeight <= 0 || options.outWidth <= 0) return false; storedHeight = options.outHeight; storedWidth = options.outWidth; return true; } public Bitmap getBitmap() throws IOException { if (!getInformation()) throw new FileNotFoundException(); if (!getStoredDimensions()) throw new InvalidObjectException(null); RectF rect = new RectF(0, 0, storedWidth, storedHeight); orientation.mapRect(rect); int width = (int)rect.width(); int height = (int)rect.height(); int subSample = 1; while (width > MAX_WIDTH || height > MAX_HEIGHT) { width /= 2; height /= 2; subSample *= 2; } if (width == 0 || height == 0) throw new InvalidObjectException(null); Options options = new Options(); options.inSampleSize = subSample; Bitmap subSampled = BitmapFactory.decodeStream(resolver.openInputStream(uri), null, options); Bitmap picture; if (!orientation.isIdentity()) { picture = Bitmap.createBitmap(subSampled, 0, 0, options.outWidth, options.outHeight, orientation, false); subSampled.recycle(); } else picture = subSampled; return picture; } } 

Les références:

Il y a deux tutoriels utiles sur le sélecteur d’images avec le code source téléchargeable ici:

Comment créer un sélecteur d’images Android

Comment sélectionner et recadrer l’image sur Android

Cependant, l’application sera forcée de se fermer parfois, vous pouvez la corriger en ajoutant android: l’atsortingbut configChanges en activité principale dans le fichier manifeste comme:

  

Il semble que l’API de l’appareil photo ait perdu le contrôle avec l’orientation, cela l’aidera. 🙂

Les solutions ci-dessous fonctionnent également pour 2.3 (Gingerbread) -4.4 (Kitkat), 5.0 (Lollipop) et 6.0 (Marshmallow) également: –

Étape 1 Code pour ouvrir la galerie pour sélectionner des photos:

 public static final int PICK_IMAGE = 1; private void takePictureFromGalleryOrAnyOtherFolder() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE); } 

Étape 2 Code pour obtenir des données dans onActivityResult :

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == PICK_IMAGE) { Uri selectedImageUri = data.getData(); Ssortingng imagePath = getRealPathFromURI(selectedImageUri); //Now you have imagePath do whatever you want to do now }//end of inner if }//end of outer if } public Ssortingng getRealPathFromURI(Uri contentUri) { //Uri contentUri = Uri.parse(contentURI); Ssortingng[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = null; try { if (Build.VERSION.SDK_INT > 19) { // Will return "image:x*" Ssortingng wholeID = DocumentsContract.getDocumentId(contentUri); // Split at colon, use second item in the array Ssortingng id = wholeID.split(":")[1]; // where id is equal to Ssortingng sel = MediaStore.Images.Media._ID + "=?"; cursor = context.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, sel, new Ssortingng[] { id }, null); } else { cursor = context.getContentResolver().query(contentUri, projection, null, null, null); } } catch (Exception e) { e.printStackTrace(); } Ssortingng path = null; try { int column_index = cursor .getColumnIndex(MediaStore.Images.Media.DATA); cursor.moveToFirst(); path = cursor.getSsortingng(column_index).toSsortingng(); cursor.close(); } catch (NullPointerException e) { e.printStackTrace(); } return path; } 

Pour afficher des images et des vidéos, essayez ceci:

  Intent intent = new Intent(); intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 1); startActivityForResult(Intent.createChooser(intent,"Wybierz plik"), SELECT_FILE); 

Juste au cas où cela aiderait; Je fais cela pour obtenir le bitmap:

 InputStream is = context.getContentResolver().openInputStream(imageUri); Bitmap bitmap = BitmapFactory.decodeStream(is); 

Ci-dessus, les réponses sont correctes. J’ai rencontré un problème différent: dans HTC M8, mon application se bloque lors de la sélection d’une image dans la galerie. J’obtiens une valeur nulle pour le chemin de l’image. J’ai corrigé et optimisé avec la solution suivante. dans la méthode onActivityResult

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if ((requestCode == RESULT_LOAD_IMAGE) && (resultCode == RESULT_OK)) { if (data != null) { Uri selectedImageUri = null; selectedImageUri = data.getData(); Ssortingng[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor imageCursor = mainActivity.getContentResolver().query( selectedImageUri, filePathColumn, null, null, null); if (imageCursor == null) { return; } imageCursor.moveToFirst(); int columnIndex = imageCursor.getColumnIndex(filePathColumn[0]); picturePath = imageCursor.getSsortingng(columnIndex); if (picturePath == null) { picturePath = selectedImageUri.getPath(); Ssortingng wholeID = DocumentsContract .getDocumentId(selectedImage); // Split at colon, use second item in the array Ssortingng id = wholeID.split(":")[1]; Ssortingng[] column = { MediaStore.Images.Media.DATA }; // where id is equal to Ssortingng sel = MediaStore.Images.Media._ID + "=?"; Cursor cursor = mainActivity.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new Ssortingng[] { id }, null); columnIndex = cursor.getColumnIndex(column[0]); if (cursor.moveToFirst()) { picturePath = cursor.getSsortingng(columnIndex); } cursor.close(); } picturePathAbs = new File(picturePath).getAbsolutePath(); imageCursor.close(); } 

}

 package com.ImageConvertingDemo; import java.io.BufferedInputStream; import java.io.FileInputStream; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Log; import android.widget.EditText; import android.widget.ImageView; public class MyActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); EditText tv = (EditText)findViewById(R.id.EditText01); ImageView iv = (ImageView)findViewById(R.id.ImageView01); FileInputStream in; BufferedInputStream buf; try { in = new FileInputStream("/sdcard/smooth.png"); buf = new BufferedInputStream(in,1070); System.out.println("1.................."+buf); byte[] bMapArray= new byte[buf.available()]; tv.setText(bMapArray.toSsortingng()); buf.read(bMapArray); Bitmap bMap = BitmapFactory.decodeByteArray(bMapArray, 0, bMapArray.length); /*for (int i = 0; i < bMapArray.length; i++) { System.out.print("bytearray"+bMapArray[i]); }*/ iv.setImageBitmap(bMap); //tv.setText(bMapArray.toString()); //tv.setText(buf.toString()); if (in != null) { in.close(); } if (buf != null) { buf.close(); } } catch (Exception e) { Log.e("Error reading file", e.toString()); } } } 
 public class BrowsePictureActivity extends Activity { // this is the action code we use in our intent, // this way we know we're looking at the response from our own action private static final int SELECT_PICTURE = 1; private Ssortingng selectedImagePath; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button) findViewById(R.id.Button01)) .setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // in onCreate or any event where your want the user to // select a file Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); } }); } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == SELECT_PICTURE) { Uri selectedImageUri = data.getData(); selectedImagePath = getPath(selectedImageUri); } } } /** * helper to resortingeve the path of an image URI */ public Ssortingng getPath(Uri uri) { // just some safety built in if( uri == null ) { // TODO perform some logging or show user feedback return null; } // try to resortingeve the image from the media store first // this will only work for images selected from gallery Ssortingng[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); if( cursor != null ){ int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getSsortingng(column_index); } // this is our fallback here return uri.getPath(); } } 

Récupérer un type de fichier spécifique

Cet exemple recevra une copie de l’image.

 static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri ... } } 

Ouvrir un type de fichier spécifique

Lorsque vous utilisez 4.4 ou supérieur, vous demandez d’ouvrir un fichier géré par une autre application

 static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri ... } } 

Source primaire

Outre les réponses précédentes, si vous rencontrez des problèmes pour obtenir le bon chemin (comme AndroZip), vous pouvez utiliser ceci:

  public Ssortingng getPath(Uri uri ,ContentResolver contentResolver) { Ssortingng[] projection = { MediaStore.MediaColumns.DATA}; Cursor cursor; try{ cursor = contentResolver.query(uri, projection, null, null, null); } catch (SecurityException e){ Ssortingng path = uri.getPath(); Ssortingng result = tryToGetStoragePath(path); return result; } if(cursor != null) { //HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL //THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA cursor.moveToFirst(); int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); Ssortingng filePath = cursor.getSsortingng(columnIndex); cursor.close(); return filePath; } else return uri.getPath(); // FOR OI/ASTRO/Dropbox etc } private Ssortingng tryToGetStoragePath(Ssortingng path) { int actualPathStart = path.indexOf("//storage"); Ssortingng result = path; if(actualPathStart!= -1 && actualPathStart< path.length()) result = path.substring(actualPathStart+1 , path.length()); return result; } 

S’il vous plaît trouver la réponse pour la sélection de l’image unique de la galerie

 import android.app.Activity; import android.net.Uri; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.InputStream; public class PickImage extends Activity { Button btnOpen, btnGet, btnPick; TextView textInfo1, textInfo2; ImageView imageView; private static final int RQS_OPEN_IMAGE = 1; private static final int RQS_GET_IMAGE = 2; private static final int RQS_PICK_IMAGE = 3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image_pick); btnOpen = (Button)findViewById(R.id.open); btnGet = (Button)findViewById(R.id.get); btnPick = (Button)findViewById(R.id.pick); textInfo1 = (TextView)findViewById(R.id.info1); textInfo2 = (TextView)findViewById(R.id.info2); imageView = (ImageView) findViewById(R.id.image); btnOpen.setOnClickListener(btnOpenOnClickListener); btnGet.setOnClickListener(btnGetOnClickListener); btnPick.setOnClickListener(btnPickOnClickListener); } View.OnClickListener btnOpenOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(intent, RQS_OPEN_IMAGE); } }; View.OnClickListener btnGetOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(intent, RQS_OPEN_IMAGE); } }; View.OnClickListener btnPickOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, RQS_PICK_IMAGE); } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == RQS_OPEN_IMAGE || requestCode == RQS_GET_IMAGE || requestCode == RQS_PICK_IMAGE) { imageView.setImageBitmap(null); textInfo1.setText(""); textInfo2.setText(""); Uri mediaUri = data.getData(); textInfo1.setText(mediaUri.toSsortingng()); Ssortingng mediaPath = mediaUri.getPath(); textInfo2.setText(mediaPath); //display the image try { InputStream inputStream = getBaseContext().getContentResolver().openInputStream(mediaUri); Bitmap bm = BitmapFactory.decodeStream(inputStream); ByteArrayOutputStream stream = new ByteArrayOutputStream(); byte[] byteArray = stream.toByteArray(); imageView.setImageBitmap(bm); } catch (FileNotFoundException e) { e.printStackTrace(); } } } } } 

Le moyen le plus rapide d’ouvrir une image depuis une galerie ou un appareil photo.

Référence originale: obtenir l’image de la galerie dans Android par programme

La méthode suivante recevra une image de la galerie ou de la caméra et l’affichera dans une ImageView. L’image sélectionnée sera stockée en interne.

code pour xml

       

Classe JAVA

 import android.content.Intent; import android.graphics.Bitmap; import android.media.MediaScannerConnection; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.androidquery.AQuery; import org.json.JSONException; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Calendar; import java.util.HashMap; public class MainActivity extends AppCompatActivity implements AsyncTaskCompleteListener{ private ParseContent parseContent; private Button btn; private ImageView imageview; private static final Ssortingng IMAGE_DIRECTORY = "/demonuts_upload_camera"; private final int CAMERA = 1; private AQuery aQuery; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); parseContent = new ParseContent(this); aQuery = new AQuery(this); btn = (Button) findViewById(R.id.btn); imageview = (ImageView) findViewById(R.id.iv); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAMERA); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == this.RESULT_CANCELED) { return; } if (requestCode == CAMERA) { Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); Ssortingng path = saveImage(thumbnail); try { uploadImageToServer(path); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } } private void uploadImageToServer(final Ssortingng path) throws IOException, JSONException { if (!AndyUtils.isNetworkAvailable(MainActivity.this)) { Toast.makeText(MainActivity.this, "Internet is required!", Toast.LENGTH_SHORT).show(); return; } HashMap map = new HashMap(); map.put("url", "https://demonuts.com/Demonuts/JsonTest/Tennis/uploadfile.php"); map.put("filename", path); new MultiPartRequester(this, map, CAMERA, this); AndyUtils.showSimpleProgressDialog(this); } @Override public void onTaskCompleted(Ssortingng response, int serviceCode) { AndyUtils.removeSimpleProgressDialog(); Log.d("res", response.toSsortingng()); switch (serviceCode) { case CAMERA: if (parseContent.isSuccess(response)) { Ssortingng url = parseContent.getURL(response); aQuery.id(imageview).image(url); } } } public Ssortingng saveImage(Bitmap myBitmap) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes); File wallpaperDirectory = new File( Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY); // have the object build the directory structure, if needed. if (!wallpaperDirectory.exists()) { wallpaperDirectory.mkdirs(); } try { File f = new File(wallpaperDirectory, Calendar.getInstance() .getTimeInMillis() + ".jpg"); f.createNewFile(); FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); MediaScannerConnection.scanFile(this, new Ssortingng[]{f.getPath()}, new Ssortingng[]{"image/jpeg"}, null); fo.close(); Log.d("TAG", "File Saved::--->" + f.getAbsolutePath()); return f.getAbsolutePath(); } catch (IOException e1) { e1.printStackTrace(); } return ""; } }