web-dev-qa-db-ja.com

Oreo DocumentsContract.getDocumentId(uri)がLongではなくパスを返す

Androidファイルシステムに保存されているファイルの実際のパスを取得しようとしています(_Android 8.1_を使用してエミュレータでテストしています)

これが私のコードです:

_final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
_

以前のバージョンの_Android 8.0_では、変数idlong値が含まれているため、次の行は期待どおりに機能します。

_Android 8_では、変数idにこのような_raw:/storage/emulated/0/Download/my_file.pdf_のようなパスが含まれているため、キャストLong.valueOf(id))は_'Java.lang.NumberFormatException' Exception._をスローします

何か案は?ありがとう。

17
Ale

同じ問題が次のようにして解決しました。

final String id = DocumentsContract.getDocumentId(uri);
if (!TextUtils.isEmpty(id)) {
            if (id.startsWith("raw:")) {
                return id.replaceFirst("raw:", "");
            }
            try {
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            } catch (NumberFormatException e) {
                 return null;
            }
      }

コメントで解決策が見つかりました https://github.com/Yalantis/uCrop/issues/318

18
Tirth Shah