web-dev-qa-db-ja.com

Android 5.0のギャラリーから写真を選択します

Android 5.0を使用してギャラリーから画像を選択すると問題が発生します。インテントを開始するための私のコードは次のとおりです:

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

そしてここにリクエストコードPICK_FROM_FILEのonActivityResult()メソッドで呼び出される関数があります

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
    ...
}

5.0より前のバージョンでは、このコードは常に機能し、com.Android.galleryアプリケーションを使用します。 GoogleフォトはAndroid 5.0のデフォルトギャラリーアプリケーションです。この問題はアプリケーションによって異なるか、新しいAndroid OSディストリビューションの問題ですか?

編集

問題を理解しました。Googleフォトは、クラウドサーバー上のバックアップされた画像のコンテンツを自動的に閲覧します。実際、各インターネット接続をオフにし、画像を選択した後、InputStreamからビットマップをデコードしても結果が得られない場合、@maveňが提案する実践を試みます。

したがって、この時点で質問は次のようになります。Android 5.0には、Intent.ACTION_PICKアクションを処理して、システムの参照がローカルデバイスの画像ギャラリーで選択できるようにする方法がありますか?

18
and.ryx

次の方法を組み合わせてこの問題の解決策を見つけました。ここで、デバイスのギャラリーから画像を選択するためのアクティビティを開始します。

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

この post で説明されているように、ここではインテントの結果を処理するため、getPath()関数はAndroid build version:

_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()onActivityResultから呼び出されます

それで全部です!!

36
and.ryx

これを試して:

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

OnActivityResultで以下を使用します。

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

更新

@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はImageSelectedのパスを格納します

これをチェック 詳細

6
Maveňツ