1. ホーム
  2. アンドロイド

[解決済み】URIから実パスを取得、Android KitKatの新ストレージアクセスフレームワーク【重複あり

2022-04-21 20:57:05

質問

で新しいギャラリーにアクセスする前 Android 4.4 (KitKat)この方法でSDカード上の実パスを取得しました。

public String getPath(Uri uri) {
   String[] projection = { MediaStore.Images.Media.DATA };
   Cursor cursor = managedQuery(uri, projection, null, null, null);
   startManagingCursor(cursor);
   int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
   cursor.moveToFirst();
 return cursor.getString(column_index);
}

さて、Intent.ACTION_GET_CONTENTは異なるデータを返します。

以前は

content://media/external/images/media/62

今すぐ

content://com.android.providers.media.documents/document/image:62

SDカード上の実際のパスを取得するにはどうしたらよいですか?

解決方法は?

注:この回答は問題の一部を取り上げています。完全な解決策(ライブラリーの形で)については、以下をご覧ください。 ポール・バーク氏の回答 .

このURIを利用して document id のどちらかに問い合わせる。 MediaStore.Images.Media.EXTERNAL_CONTENT_URI または MediaStore.Images.Media.INTERNAL_CONTENT_URI (SDカードの状況により異なります)。

ドキュメントIDを取得する。

// Will return "image:x*"
String wholeID = DocumentsContract.getDocumentId(uriThatYouCurrentlyHave);

// Split at colon, use second item in the array
String id = wholeID.split(":")[1];

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

// where id is equal to             
String sel = MediaStore.Images.Media._ID + "=?";

Cursor cursor = getContentResolver().
                          query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
                          column, sel, new String[]{ id }, null);

String filePath = "";

int columnIndex = cursor.getColumnIndex(column[0]);

if (cursor.moveToFirst()) {
    filePath = cursor.getString(columnIndex);
}   

cursor.close();

参考 この解決策が引用されている投稿を見つけることができません。元の投稿者にここに投稿をお願いしたかったのです。今夜もう少し探してみます。