Saya memiliki onActivityResult
pengembalian dari pemilihan gambar mediastore yang saya bisa mendapatkan URI untuk gambar menggunakan yang berikut:
Uri selectedImage = data.getData();
Mengubah ini menjadi string memberikan ini:
content://media/external/images/media/47
Atau ke jalan memberikan:
/external/images/media/47
Namun saya tidak bisa menemukan cara untuk mengubahnya menjadi jalur absolut, karena saya ingin memuat gambar ke dalam bitmap tanpa harus menyalinnya di suatu tempat. Saya tahu ini bisa dilakukan dengan menggunakan URI dan penyelesai konten, tetapi ini sepertinya MediaStore
berhenti saat me-reboot ponsel, saya kira tidak menjaga penomorannya tetap sama di antara reboot.
android
uri
absolute-path
mediastore
siluman
sumber
sumber
Jawaban:
Di bawah API 19 gunakan kode ini untuk mendapatkan Jalur File dari URI:
sumber
Hanya pembaruan sederhana pada jawaban pertama:
mActivity.managedQuery()
sekarang sudah usang. Saya telah memperbarui kode dengan metode baru.sumber dev android
sumber
content://...
hal itu. Saya mencoba semua saran di sini tanpa hasil. Ada yang tahu kenapa?Untuk Oreo
Untuk Semua versi di bawah Oreo saya telah membuat metode ini yang mendapatkan jalur nyata dari uri
sumber
Jangan mencoba mencari uri di sistem file, itu lambat untuk mencari di database.
Anda bisa mendapatkan bitmap dari uri dengan memberikan aliran input ke pabrik seperti Anda memberikan file ke pabrik:
sumber
Ini dia contoh saya mendapatkan nama file, dari URI like file: // ... dan content: // .... Ini berfungsi bagi saya tidak hanya dengan Android MediaStore tetapi juga dengan aplikasi bagian ketiga seperti EzExplorer.
sumber
Jawaban yang ada dan bagus, beberapa di antaranya saya gunakan untuk saya sendiri:
Saya harus mendapatkan jalur dari URI dan mendapatkan URI dari jalur, dan Google kesulitan membedakannya sehingga bagi siapa pun yang memiliki masalah yang sama (misalnya, untuk mendapatkan thumbnail dari
MediaStore
video yang lokasi fisiknya sudah Anda miliki ). Mantan:Yang terakhir (yang saya lakukan untuk video, tetapi juga dapat digunakan untuk Audio atau File atau jenis konten tersimpan lainnya dengan mengganti MediaStore.Audio (dll) untuk MediaStore.Video):
Pada dasarnya,
DATA
kolomMediaStore
(atau sub-bagian mana pun yang Anda tanyakan) menyimpan path file, jadi Anda bisa menggunakan apa yang Anda ketahui untuk mencariDATA
bidang itu, atau menggunakan bidang untuk mencari apa pun yang Anda inginkan.Saya kemudian lebih lanjut menggunakan
Scheme
seperti di atas untuk mencari tahu apa yang harus dilakukan dengan data saya:sumber
Tak satu pun dari jawaban ini bekerja untuk saya dalam semua kasus. Saya harus langsung membuka Dokumentasi Google https://developer.android.com/guide/topics/providers/document-provider.html tentang topik ini dan menemukan metode yang bermanfaat ini:
Anda dapat menggunakan bitmap ini untuk menampilkannya dalam Tampilan Gambar.
sumber
API 19 dan di atas , Path File Gambar dari Uri berfungsi dengan sempurna. Saya juga memeriksa PIE API 28 terbaru ini .
sumber
CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
pada baris ini:path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
coba ini dapatkan jalur file gambar dari Uri
sumber
Solusi bagi mereka yang memiliki masalah setelah pindah ke KitKat:
"Ini akan mendapatkan path file dari MediaProvider, DownloadsProvider, dan ExternalStorageProvider, sambil kembali ke metode ContentProvider tidak resmi" https://stackoverflow.com/a/20559175/690777
sumber
Setelah mendapatkan gambar dari galeri, kirimkan URI dalam metode di bawah ini hanya untuk Android 4.4 (KitKat):
sumber
Coba ini
Namun, jika Anda mendapatkan masalah untuk mendapatkan jalan yang sebenarnya, Anda dapat mencoba jawaban saya. Jawaban di atas tidak membantu saya.
Penjelasan : - Metode ini mendapatkan URI dan kemudian memeriksa tingkat API perangkat Android Anda setelah itu menurut tingkat API itu akan menghasilkan jalur Nyata. Kode untuk menghasilkan metode jalur nyata berbeda menurut tingkat API.
metode untuk mendapatkan jalur Nyata dari URI
Gunakan metode ini seperti ini
Keluaran:-
sumber
String wholeID = DocumentsContract.getDocumentId(uri);
saya dapatkan:java.lang.RuntimeException: Failure delivering result
Saya sudah melakukan ini:
sumber
Karena managedQuery sudah tidak digunakan lagi, Anda dapat mencoba:
sumber
Di sini saya akan menunjukkan kepada Anda bahwa cara membuat tombol BROWSE, yang ketika Anda mengklik, itu akan membuka kartu SD, Anda akan memilih File dan sebagai hasilnya Anda akan mendapatkan nama file dan path file yang dipilih satu:
Sebuah tombol yang akan Anda tekan
Fungsi yang akan mendapatkan Nama File yang Dihasilkan dan Path File
sumber
content://com.fsck.k9.attachmentprovider/34fc2cc9-aa46-45e9-9e3f-2f27f0457249/1/VIEW
. Setelah menerapkan metode di sini, saya masih mendapatkan string yang sama, bukan jalur yang benar, yaitu/mnt/sdcard/Android/data/com.fsck.k9/files/34fc2cc9-aa46-45e9-9e3f-2f27f0457249.db_att/1
. Ada petunjuk?Apa pun cara untuk Android Q yang lalu , ketika MediaStore.Images.Media.DATA tidak akan tersedia lagi? Bidang ini disusutkan di Android Q:
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#DATA
--- Diedit
Sejauh yang saya tahu untuk Android Q masa lalu, satu-satunya cara adalah menyampaikan pada RELATIVE_PATH
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#RELATIVE_PATH
sumber
Versi @PercyPercy yang sedikit dimodifikasi - tidak melempar dan hanya mengembalikan nol jika terjadi kesalahan :
sumber
Di sini Anda mendapatkan nama file
sumber
Sederhana dan mudah. Anda dapat melakukan ini dari URI seperti di bawah ini!
sumber
Solusi ini berfungsi untuk setiap kasus:
Terlalu sulit dalam beberapa kasus mendapatkan jalur dari URL. Lalu mengapa Anda membutuhkan jalan? Untuk menyalin file di tempat lain? Anda tidak perlu jalan.
sumber
Bekerja dengan sempurna untuk saya memperbaiki kode dari pos ini :
sumber
Sebagai tambahan, jika Anda perlu melihat apakah ada file sebelum Anda mencoba membuka aliran input, Anda dapat menggunakan DocumentsContract.
(Kode Kotlin)
sumber
Karena jawaban di atas tidak bekerja untuk saya, berikut adalah solusi yang bekerja untuk saya:
Untuk keduanya> 19 dan <= 19 Level API.
Metode ini mencakup semua kasus untuk mendapatkan filePath dari uri
sumber
Untuk mendapatkan segala jenis jalur file gunakan ini:
sumber
Periksa metode di bawah ini berfungsi juga Oreo 8.1 ..
Kelas jalur URI:
sumber
Saya melakukan ini dengan satu liner:
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
Yang pada onActivityResult terlihat seperti:
sumber
Hal-hal rumit sekarang terutama setelah API level 29 Android Q. Ini adalah bagaimana Anda harus mendapatkan nama file dari konten Uri
dan ini adalah bagaimana Anda mendapatkan path lengkap Uri Konten untuk semua versi android
sumber
Ini berfungsi dengan baik untuk saya jika versi sistem Anda di atas 19, Semoga ini bisa membantu Anda.
sumber
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
sumber