web-dev-qa-db-fra.com

Choisissez une photo de la galerie dans Android 5.0

Je rencontre un problème en choisissant des images dans la galerie avec Android 5.0. Mon code pour l'intention de départ est:

private void takePictureFromGallery() 
{
    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(intent, PICK_FROM_FILE);
}

et voici la fonction appelée dans la méthode onActivityResult () pour le code de demande PICK_FROM_FILE

private void handleGalleryResult(Intent data) 
{
    Uri selectedImage = data.getData();
    String[] filePathColumn = { MediaStore.Images.Media.DATA };

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

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    // field declaration private String mTmpGalleryPicturePath;
    mTmpGalleryPicturePath = cursor.getString(columnIndex);
    cursor.close();
    // at this point mTmpGalleryPicturePath is null
    ...
}

Pour les versions antérieures à 5.0, ce code fonctionne toujours, en utilisant l'application com.Android.gallery. Google Photos est l'application de galerie par défaut sur Android 5.0. Ce problème peut-il dépendre de l'application ou est-il un problème de nouvelle distribution Android OS)?

ÉDITER

Je comprends le problème: Google Photos parcourt automatiquement le contenu de ses images sauvegardées sur le serveur cloud. En fait, essayer la pratique suggérée par @ maveň si je désactive chaque connexion Internet et après avoir choisi une image, elle n'obtient pas de résultat en décodant Bitmap depuis InputStream.

Donc, à ce stade, la question devient: existe-t-il un moyen dans Android 5.0 pour gérer l'action Intent.ACTION_PICK afin que la navigation du système choisisse dans la galerie d'images de l'appareil local?

18
and.ryx

J'ai trouvé une solution à ce problème en combinant les méthodes suivantes. Ici pour commencer l'activité pour choisir une image dans la galerie de l'appareil:

private void takePictureFromGallery() 
{
    startActivityForResult(
        Intent.createChooser(
            new Intent(Intent.ACTION_GET_CONTENT)
            .setType("image/*"), "Choose an image"), 
        PICK_FROM_FILE);
}

Ici pour gérer le résultat de l'intention, comme décrit dans cette post , notez que la fonction getPath() fonctionne différemment depuis Android version de construction:

private void handleGalleryResult(Intent data) 
{
    Uri selectedImage = data.getData();
    mTmpGalleryPicturePath = getPath(selectedImage);
    if(mTmpGalleryPicturePath!=null)
        ImageUtils.setPictureOnScreen(mTmpGalleryPicturePath, mImageView);
    else
    {
        try {
            InputStream is = getContentResolver().openInputStream(selectedImage);
            mImageView.setImageBitmap(BitmapFactory.decodeStream(is));
            mTmpGalleryPicturePath = selectedImage.getPath();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

@SuppressLint("NewApi")
private String getPath(Uri uri) {
    if( uri == null ) {
        return null;
    }

    String[] projection = { MediaStore.Images.Media.DATA };

    Cursor cursor;
    if(Build.VERSION.SDK_INT >19)
    {
        // Will return "image:x*"
        String wholeID = DocumentsContract.getDocumentId(uri);
        // Split at colon, use second item in the array
        String id = wholeID.split(":")[1];
        // where id is equal to             
        String sel = MediaStore.Images.Media._ID + "=?";

        cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                                      projection, sel, new String[]{ id }, null);
    }
    else
    {
        cursor = getContentResolver().query(uri, projection, null, null, null);
    }
    String path = null;
    try
    {
        int column_index = cursor
        .getColumnIndex(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        path = cursor.getString(column_index).toString();
        cursor.close();
    }
    catch(NullPointerException e) {

    }
    return path;
}
  • takePictureFromGallery() est invoquée depuis onActivityResult

C'est tout!!

36
and.ryx

Essaye ça:

//5.0
Intent i = new Intent(Intent.ACTION_PICK,Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, CHOOSE_IMAGE_REQUEST);

Utilisez ce qui suit dans le onActivityResult:

Uri selectedImageURI = data.getData();
input = c.getContentResolver().openInputStream(selectedImageURI);
BitmapFactory.decodeStream(input , null, opts);

Mettre à jour

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

Uri selectedImageUri = data.getData();  
String tempPath = getPath(selectedImageUri);

/**
* helper to retrieve the path of an image URI
*/
public String getPath(Uri uri) {
    if( uri == null ) {
        return null;
    }
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
    if( cursor != null ){
        int column_index = cursor
        .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    return uri.getPath();
  }

  }  }

tempPath stockera le chemin de l'ImageSelected

Cochez ceci pour plus de détails

6
Maveňツ