Saya menggunakan pengelola file pihak ketiga untuk memilih file (PDF dalam kasus saya) dari sistem file.
Beginilah cara saya meluncurkan aktivitas:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(getString(R.string.app_pdf_mime_type));
intent.addCategory(Intent.CATEGORY_OPENABLE);
String chooserName = getString(R.string.Browse);
Intent chooser = Intent.createChooser(intent, chooserName);
startActivityForResult(chooser, ActivityRequests.BROWSE);
Inilah yang saya miliki onActivityResult
:
Uri uri = data.getData();
if (uri != null) {
if (uri.toString().startsWith("file:")) {
fileName = uri.getPath();
} else { // uri.startsWith("content:")
Cursor c = getContentResolver().query(uri, null, null, null, null);
if (c != null && c.moveToFirst()) {
int id = c.getColumnIndex(Images.Media.DATA);
if (id != -1) {
fileName = c.getString(id);
}
}
}
}
Potongan kode dipinjam dari instruksi Open Intents File Manager yang tersedia di sini:
http://www.openintents.org/en/node/829
Tujuannya if-else
adalah kompatibilitas ke belakang. Saya ingin tahu apakah ini cara terbaik untuk mendapatkan nama file karena saya telah menemukan bahwa pengelola file lain mengembalikan semua jenis hal.
Misalnya, Documents ToGo mengembalikan sesuatu seperti berikut:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
yang getContentResolver().query()
kembali null
.
Untuk membuatnya lebih menarik, pengelola file tanpa nama (saya mendapatkan URI ini dari log klien) mengembalikan sesuatu seperti:
/./sdcard/downloads/.bin
Apakah ada cara yang disukai untuk mengekstrak nama file dari URI atau harus menggunakan penguraian string?
Jawaban:
developer.android.com memiliki kode contoh yang bagus untuk ini: https://developer.android.com/guide/topics/providers/document-provider.html
Versi ringkas untuk mengekstrak nama file (dengan asumsi "ini" adalah Aktivitas):
sumber
file://
kecontent://
dalamonScanCompleted(String path, Uri uri)
metode stackoverflow.com/a/5815005/2163045new String[]{OpenableColumns.DISPLAY_NAME}
sebagai parameter kedua ke kueri akan memfilter kolom untuk permintaan yang lebih efisien.OpenableColumns.DISPLAY_NAME
tidak berhasil untuk saya, saya gunakanMediaStore.Files.FileColumns.TITLE
sebagai gantinya.java.lang.IllegalArgumentException: Invalid column latitude
sayangnya. Bekerja dengan sempurna untuk foto!Saya menggunakan sesuatu seperti ini:
sumber
cursor
bukanclose()
d?Diambil dari Mengambil informasi File | Pengembang Android
Mengambil nama File.
sumber
Cara termudah untuk mendapatkan nama file:
Jika mereka tidak memberi Anda nama yang tepat, Anda harus menggunakan:
sumber
File(uri.path).name
berfungsi, terima kasih!Jika Anda menginginkannya singkat, ini harus berhasil.
sumber
Saya menggunakan kode di bawah ini untuk mendapatkan Nama File & Ukuran File dari Uri dalam proyek saya.
sumber
Versi paling padat:
sumber
Untuk Kotlin, Anda dapat menggunakan sesuatu seperti ini:
sumber
sumber
sumber
Versi jawaban saya sebenarnya sangat mirip dengan @Stefan Haustein. Saya menemukan jawabannya di halaman Pengembang Android Mengambil Informasi File ; informasi di sini bahkan lebih ringkas tentang topik khusus ini daripada di situs panduan Storage Access Framework . Dalam hasil dari query indeks kolom yang berisi nama file adalah
OpenableColumns.DISPLAY_NAME
. Tidak ada jawaban / solusi lain untuk indeks kolom yang berhasil untuk saya. Di bawah ini adalah contoh fungsi:sumber
Pertama, Anda perlu mengonversi
URI
objek Anda menjadiURL
objek, lalu menggunakanFile
objek untuk mengambil nama file:Itu dia, sangat mudah.
sumber
Fungsi Stefan Haustein untuk xamarin / c #:
sumber
Jika Anda ingin memiliki nama file dengan ekstensi, saya menggunakan fungsi ini untuk mendapatkannya. Ia juga bekerja dengan pengambilan file google drive
sumber
Ini benar-benar berhasil untuk saya:
sumber
Silakan coba ini:
sumber
Kombinasi dari semua jawaban
Inilah yang saya dapatkan setelah membaca semua jawaban yang disajikan di sini serta apa yang telah dilakukan beberapa Airgram di SDK mereka - Sebuah utilitas yang saya buka bersumber di Github:
https://github.com/mankum93/UriUtilsAndroid/tree/master/app/src/main/java/com/androiduriutils
Pemakaian
Sesederhana menelepon
UriUtils.getDisplayNameSize()
,. Ini memberikan nama dan ukuran konten.Catatan: Hanya bekerja dengan konten: // Uri
Berikut ini sekilas tentang kodenya:
sumber