Apa cara termudah untuk mengonversi dari a file:
android.net.Uri
ke dalam File
di Android?
Mencoba yang berikut tetapi tidak berhasil:
final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());
Jawaban:
Yang kamu inginkan adalah ...
... dan tidak...
CATATAN:
uri.toString()
kembali sebuah String dalam format:"file:///mnt/sdcard/myPicture.jpg"
, sedangkanuri.getPath()
hasil String dalam format:"/mnt/sdcard/myPicture.jpg"
.sumber
toString
harus dilakukanurl.toString()
mengembalikan sebuah String dalam format berikut: "file: ///mnt/sdcard/myPicture.jpg", sedangkanurl.getPath()
mengembalikan sebuah String dalam format berikut: "/mnt/sdcard/myPicture.jpg", yaitu tanpa jenis skema pra- tetap.open failed: ENOENT (No such file or directory)
Ketika saya mencoba membuka File yang diberikan dengan ini. Juga, jika Uri adalah Konten Uri dari suatu Gambar misalnya, itu pasti tidak berfungsi.Setelah lama mencari, inilah yang bekerja untuk saya:
sumber
managedQuery
sekarang sudah ditinggalkan. gunakangetContentResolver().query(...)
sebaliknya, yang berfungsi di API 11+. Tambahkan persyaratan untuk perangkat yang lebih lama dari API 11.menggunakan
langsung dan salin file. Lihat juga:
https://developer.android.com/guide/topics/providers/document-provider.html
sumber
EDIT: Maaf, saya harus menguji lebih baik sebelumnya. Ini seharusnya bekerja:
URI adalah java.net.URI.
sumber
androidURI
adalah android.net.Uri. java.net.URI (yang memang ada di Android) hanya digunakan sebagai bagian dari proses konversi.java.lang.IllegalArgumentException: Expected file scheme in URI: content://com.shajeel.daily_monitoring.localstorage.documents.localstorage.documents/document/%2Fstorage%2Femulated%2F0%2FBook1.xlsx
pengecualian setelah menggunakan metode ini.Solusi terbaik
Buat satu kelas FileUtil sederhana & gunakan untuk membuat, menyalin, dan mengganti nama file
Saya menggunakan
uri.toString()
danuri.getPath()
tetapi tidak bekerja untuk saya. Saya akhirnya menemukan solusi ini.Gunakan kelas FileUtil dalam kode Anda
sumber
Tak satu pun dari ini bekerja untuk saya. Saya menemukan ini sebagai solusi kerja. Tapi kasing saya khusus untuk gambar .
sumber
Android + Kotlin
Tambahkan ketergantungan untuk ekstensi Kotlin Android:
implementation 'androidx.core:core-ktx:{latestVersion}'
Dapatkan file dari uri:
uri.toFile()
Android + Java
Cukup pindah ke atas;)
sumber
file
Dengan Kotlin bahkan lebih mudah:
Atau jika Anda menggunakan ekstensi Kotlin untuk Android :
sumber
@CommonsWare menjelaskan semua hal dengan cukup baik. Dan kita benar-benar harus menggunakan solusi yang dia usulkan.
Ngomong-ngomong, hanya informasi yang bisa kita andalkan ketika kueri
ContentResolver
adalah nama dan ukuran file seperti yang disebutkan di sini: Mengambil Informasi File | Pengembang AndroidSeperti yang Anda lihat ada antarmuka
OpenableColumns
yang hanya berisi dua bidang: DISPLAY_NAME dan SIZE.Dalam kasus saya, saya perlu mengambil informasi EXIF tentang gambar JPEG dan memutarnya jika perlu sebelum mengirim ke server. Untuk melakukan itu saya menyalin konten file ke file sementara menggunakan
ContentResolver
danopenInputStream()
sumber
Saya membuat ini seperti cara berikut:
Jadi pada dasarnya pertama saya mencoba menggunakan file yaitu gambar yang diambil oleh kamera dan disimpan di kartu SD. Ini tidak berfungsi untuk gambar yang dikembalikan oleh: Intent photoPickerIntent = Intent baru (Intent.ACTION_PICK); Kasus itu ada kebutuhan untuk mengubah Uri ke jalur nyata dengan
getRealPathFromURI()
fungsi. Jadi kesimpulannya adalah itu tergantung pada jenis Uri apa yang ingin Anda konversi ke File.sumber
Jika Anda memiliki
Uri
yang sesuai dengan ituDocumentContract
maka Anda mungkin tidak ingin menggunakannyaFile
. Jika Anda menggunakan kotlin, gunakanDocumentFile
untuk melakukan hal-hal yang akan Anda gunakan di Dunia lamaFile
, dan gunakanContentResolver
untuk mendapatkan streaming.Segala sesuatu yang lain cukup banyak dijamin akan rusak.
sumber
Untuk kasus ini, terutama pada Android, cara menggunakan byte biasanya lebih cepat.
Dengan ini, saya menyelesaikannya dengan mengatur kelas
FileHelper
yang diberi tanggung jawab untuk berurusan dengan membaca / menulis byte dari / ke file melalui aliran dan kelasUriHelper
yang diberi tanggung jawab untuk mengetahui jalur Uri dan izin.Sejauh yang diketahui secara umum,
string.getBytes((charset == null) ? DEFAULT_CHARSET:charset)
dapat membantu kami mentransfer string yang Anda inginkan ke byte yang Anda butuhkan.Cara membiarkan UriHelper dan FileHelper Anda untuk menyalin gambar yang dicatat oleh Uri ke dalam file, Anda dapat menjalankan:
tentang UriHelper saya:
}
tentang FileHelper saya:
}
sumber
Untuk orang-orang yang ada di sini mencari solusi untuk gambar khususnya di sini.
sumber
File imageToUpload = File baru (URI baru (androidURI.toString ())); berfungsi jika ini adalah file yang Anda buat di penyimpanan eksternal.
Misalnya file: /// storage / emulated / 0 / (beberapa direktori dan nama file)
sumber
public String getRealPathFromURI (Uri uri) {
Kemudian gunakan untuk mendapatkan file dari URI:
--HOPE DAPAT MEMBANTU ANDA ----
sumber
Dengan kode berikut, saya bisa mendapatkan aplikasi adobe berbagi file pdf sebagai aliran dan menyimpan ke jalur aplikasi android
sumber
Ekstensi berbasis pada jawaban @Jacek Kwiecień untuk mengkonversi gambar uri ke file
Jika kita gunakan
File(uri.getPath())
, itu tidak akan berfungsiJika kita menggunakan ekstensi dari android-ktx , itu masih tidak berfungsi juga karena https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt
sumber
DATA
kolom (dan itu adalah pendekatan yang tidak dapat diandalkan sejak awal).Tambahkan
onActivityResult
, dapatkan dokumen, atau file pdfsumber