2017-07-07 1 views
2

j'ai et ImageView et il est censé être rempli d'une image de la galerie avec ce code:setImageBitmap() ne fonctionne pas

Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT); 
      getIntent.setType("image/*"); 
      Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      pickIntent.setType("image/*"); 

      Intent chooserIntent = Intent.createChooser(getIntent, "Pick an image."); 
      chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent}); 

      startActivityForResult(chooserIntent, PICK_IMAGE_REQUEST); 

Maintenant, tout va bien dans cette partie du code, le problème est dans onActivityResult(), exactement dans setImageBitmap() car imageView n'adopte pas l'image de Gallery. Ceci est le code de onActivityResult():

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

    if(requestCode == PICK_IMAGE_REQUEST || resultCode == PromoUpload.RESULT_OK){ 

     Uri selectedImage = data.getData(); 
     String[] filepathColumm = {MediaStore.Images.Media.DATA}; 

     Cursor cursor = getContentResolver().query(selectedImage, filepathColumm, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filepathColumm[0]); 
     String picturePath = cursor.getString(columnIndex); 
     cursor.close(); 

     Bitmap bitmap = BitmapFactory.decodeFile(picturePath); 
     imagePromo.setImageBitmap(bitmap); 
     pictureFlag = 1; 

    } 

I Toast l'attribut picturePath et il est affiché ok, le problème est exactement ici:

Bitmap bitmap = BitmapFactory.decodeFile(picturePath); 
    imagePromo.setImageBitmap(bitmap); 

Mais je ne sais pas ce que je fais faux. Tel est le XML du ImageView:

<ImageView 
     android:id="@+id/imageView_promo" 
     android:layout_width="300dp" 
     android:layout_height="300dp" 
     android:layout_centerHorizontal="true" 
     android:padding="1dp" /> 

J'ai aussi essayé de sélectionner des images de tailles multiples, mais il ne semble pas fonctionner ...

Répondre

2

Mais je ne sais pas ce que je fais mal

Vous présumez que chaque Uri provient du MediaStore et que chaque entrée du MediaStore a un chemin utile. Aucun n'est vrai.

Ce que vous devez faire est passer selectedImage à une bibliothèque de chargement d'image (Glide, Picasso, etc.), comme les bibliothèques savent non seulement comment utiliser le Uri correctement, mais ils feront le chargement d'images sur un thread de fond, plutôt que de geler l'interface utilisateur comme vous le faites ici. Vous pouvez également apprendre à la bibliothèque de chargement d'images à redimensionner l'image pour l'adapter à votre ImageView, pour économiser de l'espace sur le tas.

Un remplacement plus direct de votre code serait:

Uri selectedImage = data.getData(); 
    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage)); 
    imagePromo.setImageBitmap(bitmap); 
    pictureFlag = 1; 

Mais, comme il est indiqué, cela va geler votre interface utilisateur tandis que le disque d'E/S et le décodage d'image est en cours.

+0

merci! le remplacement a aidé. Quoi qu'il en soit, comme je l'ai dit, j'essaierai d'implanter Glide ou Picasso dans mon projet. –

0

aiderai cela,

BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
Bitmap bitmap = BitmapFactory.decodeFile(picturePath,bmOptions); 
imageView.setImageBitmap(bitmap);