Di aplikasi saya, pengguna harus memilih file audio yang kemudian ditangani oleh aplikasi. Masalahnya adalah agar aplikasi melakukan apa yang saya inginkan dengan file audio, saya perlu URI dalam format file. Ketika saya menggunakan pemutar musik asli Android untuk mencari file audio di aplikasi, URI adalah konten URI, yang terlihat seperti ini:
content://media/external/audio/media/710
Namun, menggunakan aplikasi pengelola file populer Astro, saya mendapatkan yang berikut:
file:///sdcard/media/audio/ringtones/GetupGetOut.mp3
Yang terakhir ini jauh lebih mudah diakses untuk saya gunakan, tetapi tentu saja saya ingin aplikasi memiliki fungsi dengan file audio yang dipilih pengguna terlepas dari program yang mereka gunakan untuk menelusuri koleksi mereka. Jadi pertanyaan saya adalah, apakah ada cara untuk mengubah content://
gaya URI menjadi file://
URI? Kalau tidak, apa yang akan Anda rekomendasikan untuk saya untuk menyelesaikan masalah ini? Berikut adalah kode yang memanggil pemilih, untuk referensi:
Intent ringIntent = new Intent();
ringIntent.setType("audio/mp3");
ringIntent.setAction(Intent.ACTION_GET_CONTENT);
ringIntent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(ringIntent, "Select Ringtone"), SELECT_RINGTONE);
Saya melakukan hal berikut dengan konten URI:
m_ringerPath = m_ringtoneUri.getPath();
File file = new File(m_ringerPath);
Kemudian lakukan beberapa hal FileInputStream dengan kata file.
Jawaban:
Cukup gunakan
getContentResolver().openInputStream(uri)
untuk mendapatkanInputStream
dari URI.http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)
sumber
Ini adalah jawaban lama dengan cara usang dan tidak rapi untuk mengatasi beberapa titik nyeri pemecah konten tertentu. Bawa dengan sejumlah besar garam dan gunakan API openInputStream yang tepat jika memungkinkan.
Anda dapat menggunakan Penyelesai Konten untuk mendapatkan
file://
lintasan daricontent://
URI:sumber
android.provider.MediaStore.Images.ImageColumns.DATA
) selalu dijamin ada jika skema itucontent://
?File
ketika Anda mencoba untuk memotong ContentResolver. Gunakan metode ContentResolver untuk beroperasi dicontent://
uris, ini adalah pendekatan resmi, didorong oleh para insinyur Google.Jika Anda memiliki Uri konten,
content://com.externalstorage...
Anda dapat menggunakan metode ini untuk mendapatkan path absolut dari folder atau file di Android 19 atau lebih tinggi .Anda dapat memeriksa setiap bagian dari Uri menggunakan println. Nilai yang dikembalikan untuk kartu SD dan memori utama perangkat saya tercantum di bawah ini. Anda dapat mengakses dan menghapus jika file ada di memori tetapi saya tidak dapat menghapus file dari kartu SD menggunakan metode ini, hanya membaca atau membuka gambar menggunakan jalur absolut ini. Jika Anda telah menemukan solusi untuk dihapus menggunakan metode ini, silakan bagikan. KARTU SD
MEMORI UTAMA
Jika Anda ingin mendapatkan Uri
file:///
setelah mendapatkan jalur gunakansumber
Mencoba menangani URI dengan konten: // skema dengan menelepon
ContentResolver.query()
bukanlah solusi yang baik. Pada HTC Desire menjalankan 4.2.2 Anda bisa mendapatkan NULL sebagai hasil permintaan.Mengapa tidak menggunakan ContentResolver saja? https://stackoverflow.com/a/29141800/3205334
sumber
content://
uri, yang sesuai dengan file di direktori internal pribadi, Anda tidak akan dapat menggunakan uri itu denganFile
API di versi Android yang baru. ContentResolver dirancang untuk mengatasi keterbatasan keamanan semacam ini. Jika Anda mendapatkan uri dari ContentResolver, Anda dapat mengharapkannya berfungsi.Jawaban yang diilhami adalah Jason LaBrun & Darth Raven . Mencoba pendekatan yang sudah dijawab membawa saya ke solusi di bawah ini yang sebagian besar dapat mencakup kursor nol kasus & konversi dari konten: // ke file: //
Untuk mengonversi file, baca & tulis file dari diperoleh uri
Untuk menggunakan nama file, ini akan mencakup kursor null case
Ada opsi yang baik untuk mengkonversi dari tipe mime ke ekstensi file
Kursor untuk mendapatkan nama file
sumber
Yah saya agak terlambat untuk menjawab, tetapi kode saya diuji
periksa skema dari uri:
Dalam jawaban di atas saya mengonversi uri video ke array byte, tetapi itu tidak terkait dengan pertanyaan, saya hanya menyalin kode lengkap saya untuk menunjukkan penggunaan
FileInputStream
danInputStream
karena keduanya bekerja sama dalam kode saya.Saya menggunakan konteks variabel yang getActivity () di Fragmen saya dan di Activity itu hanya ActivityName.this
context=getActivity();
// dalam Fragmencontext=ActivityName.this;
// dalam aktivitassumber
byte[] videoBytes;
? Sebagian besar jawaban hanya menunjukkan cara menggunakanInputStream
dengan gambar.