Samsung Galaxy S3 memiliki slot kartu SD eksternal, yang dipasang ke /mnt/extSdCard
.
Bagaimana saya bisa mendapatkan jalan ini dengan sesuatu seperti Environment.getExternalStorageDirectory()
?
Ini akan kembali mnt/sdcard
, dan saya tidak dapat menemukan API untuk kartu SD eksternal. (Atau penyimpanan USB yang dapat dilepas pada beberapa tablet.)
android
android-sdcard
Romulus Urakagi Ts'ai
sumber
sumber
Jawaban:
Saya memiliki variasi solusi yang saya temukan di sini
Metode asli telah diuji dan dikerjakan
Saya tidak yakin versi Android apa ini saat diuji.
Saya telah menguji versi modifikasi saya dengan
dan beberapa perangkat penyimpanan tunggal yang menggunakan kartu sd sebagai penyimpanan utamanya
Kecuali Incredible, semua perangkat ini hanya mengembalikan penyimpanan yang dapat dilepas. Mungkin ada beberapa pemeriksaan tambahan yang harus saya lakukan, tetapi ini setidaknya sedikit lebih baik daripada solusi apa pun yang saya temukan sejauh ini.
sumber
Saya menemukan cara yang lebih andal untuk mendapatkan jalur ke semua SD-CARD dalam sistem. Ini berfungsi pada semua versi Android dan mengembalikan jalur ke semua penyimpanan (termasuk emulasi).
Bekerja dengan benar di semua perangkat saya.
PS: Berdasarkan kode sumber kelas Lingkungan.
sumber
Pattern
untuk/
System.getenv("SECONDARY_STORAGE")
pengembalian/storage/sdcard1
. Lokasi itu tidak ada, tetapi lokasi sebenarnya adalah/storage/42CE-FD0A
, di mana 42CE-FD0A adalah nomor seri volume dari partisi yang diformat.Saya kira untuk menggunakan sdcard eksternal Anda perlu menggunakan ini:
ATAU
dalam kasusmu ...
sebagai pengganti
Environment.getExternalStorageDirectory()
Bekerja untuk saya. Anda harus memeriksa apa yang ada di direktori mnt terlebih dahulu dan bekerja dari sana ..
Anda harus menggunakan beberapa jenis metode pemilihan untuk memilih kartu sd mana yang akan digunakan:
sumber
Untuk mengambil semua Penyimpanan Eksternal (apakah itu kartu SD atau penyimpanan internal yang tidak dapat dilepas ), Anda dapat menggunakan kode berikut:
Atau, Anda dapat menggunakan System.getenv ("EXTERNAL_STORAGE") untuk mengambil direktori Penyimpanan Eksternal utama (mis. "/ Storage / sdcard0" ) dan System.getenv ("SECONDARY_STORAGE") untuk mengambil kembali daftar semua direktori sekunder (mis. " / storage / extSdCard: / storage / UsbDriveA: / storage / UsbDriveB " ). Ingatlah bahwa, juga dalam kasus ini, Anda mungkin ingin memfilter daftar direktori sekunder untuk mengecualikan drive USB.
Bagaimanapun, harap dicatat bahwa menggunakan jalur hard-code selalu merupakan pendekatan yang buruk (terutama ketika setiap pabrikan dapat mengubahnya sesuka hati).
sumber
Saya menggunakan solusi Dmitriy Lozenko sampai saya memeriksa pada Asus Zenfone2 , Marshmallow 6.0.1 dan solusinya tidak berfungsi. Solusi gagal saat mendapatkan EMULATED_STORAGE_TARGET , khusus untuk jalur microSD, yaitu: / storage / F99C-10F4 / . Saya mengedit kode untuk mendapatkan jalur root yang diemulasi langsung dari jalur aplikasi yang diemulasi dengan
context.getExternalFilesDirs(null);
dan menambahkan jalur fisik khusus model telepon yang lebih dikenal .Untuk mempermudah hidup kita, saya membuat perpustakaan di sini . Anda dapat menggunakannya melalui sistem build gradle, maven, sbt, dan leiningen.
Jika Anda menyukai cara kuno, Anda juga dapat melakukan copy paste file langsung dari sini , tetapi Anda tidak akan tahu jika ada update di masa mendatang tanpa memeriksanya secara manual.
Jika Anda memiliki pertanyaan atau saran, beri tahu saya
sumber
context.getExternalFilesDirs(null)
akan kembalinull
untuk salah satu file dan akan ada pengecualian di loop berikutnya. Saya sarankan menambahkanif (file == null) continue;
sebagai baris pertama dalam lingkaran.Kabar baik! Di KitKat sekarang ada API publik untuk berinteraksi dengan perangkat penyimpanan bersama sekunder ini.
Metode
Context.getExternalFilesDirs()
dan baruContext.getExternalCacheDirs()
dapat mengembalikan beberapa jalur, termasuk perangkat primer dan sekunder. Anda kemudian dapat mengulanginya dan memeriksaEnvironment.getStorageState()
sertaFile.getFreeSpace()
menentukan tempat terbaik untuk menyimpan file Anda. Metode ini juga tersediaContextCompat
di pustaka support-v4.Perhatikan juga bahwa jika Anda hanya tertarik menggunakan direktori yang dikembalikan oleh
Context
, Anda tidak lagi memerlukan izinREAD_
atauWRITE_EXTERNAL_STORAGE
. Ke depannya, Anda akan selalu memiliki akses baca / tulis ke direktori ini tanpa izin tambahan yang diperlukan.Aplikasi juga dapat terus berfungsi pada perangkat yang lebih lama dengan menghentikan permintaan izinnya seperti ini:
sumber
Saya melakukan hal berikut untuk mendapatkan akses ke semua kartu sd eksternal.
Dengan:
Anda mendapatkan jalur ke SD eksternal primer Kemudian dengan:
Anda mendapatkan dir induk dari penyimpanan eksternal primer, dan itu juga merupakan induk dari semua sd eksternal. Sekarang, Anda dapat membuat daftar semua penyimpanan dan memilih yang Anda inginkan.
Semoga bermanfaat.
sumber
Inilah cara saya mendapatkan daftar jalur kartu SD (tidak termasuk penyimpanan eksternal utama):
sumber
externalCacheDirs[0].getParentFile().getParentFile().getParentFile().getParentFile().getAbsolutePath()
Ini adalah resep bencana. Jika Anda melakukan ini, Anda mungkin juga hanya membuat kode keras jalur yang Anda inginkan karena, jika Anda mendapatkan dir cache dengan apa pun selain 4 orang tua, Anda akan mendapatkan NullPointerException atau jalur yang salah.Terimakasih atas petunjuk yang diberikan oleh kalian khususnya @SmartLemon, saya dapat solusinya. Jika orang lain membutuhkannya, saya meletakkan solusi terakhir saya di sini (untuk menemukan kartu SD eksternal pertama yang terdaftar):
Jika tidak ada kartu SD eksternal di sana, maka itu mengembalikan penyimpanan papan. Saya akan menggunakannya jika sdcard tidak ada, Anda mungkin perlu mengubahnya.
sumber
lihat kode saya, semoga bermanfaat untuk Anda:
sumber
Sebenarnya di beberapa perangkat nama default sdcard eksternal ditampilkan sebagai
extSdCard
dan untuk yang lain itusdcard1
.Cuplikan kode ini membantu menemukan jalur yang tepat dan membantu Anda mengambil jalur perangkat eksternal.
sumber
Iya. Pabrikan yang berbeda menggunakan nama SDcard yang berbeda seperti di Samsung Tab 3 extsdnya, dan perangkat samsung lainnya menggunakan sdcard seperti ini pabrikan yang berbeda menggunakan nama yang berbeda.
Saya memiliki persyaratan yang sama seperti Anda. jadi saya telah membuat contoh contoh untuk Anda dari proyek saya, goto tautan ini, contoh pemilih Direktori Android yang menggunakan pustaka androi-dirchooser. Contoh ini mendeteksi kartu SD dan mencantumkan semua subfolder dan juga mendeteksi jika perangkat memiliki lebih dari satu kartu SD.
Bagian dari kode terlihat seperti ini. Untuk contoh lengkap, buka tautan Pemilih Direktori Android
sumber
Solusi ini (dikumpulkan dari jawaban lain untuk pertanyaan ini) menangani fakta (seperti yang disebutkan oleh @ono) yang
System.getenv("SECONDARY_STORAGE")
tidak ada gunanya dengan Marshmallow.Diuji dan dikerjakan:
Samsung Galaxy Tab A (Android 6.0.1 - Saham)
sumber
rawSecondaryStoragesStr.contains(path)
ini memungkinkan penyimpanan internal juga ditambahkan; kami dapat lebih baik menghapus kondisi itu .. Saya menghadapi masalah itu, karena perangkat saya mengembalikan direktori penyimpanan internal denganSystem.getenv("SECONDARY_STORAGE")
, tetapi mengembalikan jalur Kartu Memori Eksternal denganSystem.getenv(EXTERNAL_STORAGE)
pada KitKat; tampaknya vendor yang berbeda telah menerapkan ini secara berbeda tanpa standar sialan ..Pada beberapa perangkat (misalnya samsung galaxy sII) kartu memori internal mabe harus di vfat. Dalam hal ini gunakan rujuk kode terakhir, kami memperoleh jalur kartu memori internal (/ mnt / sdcad) tetapi tidak ada kartu eksternal. Kode rujuk di bawah memecahkan masalah ini.
sumber
sumber
Saya yakin kode ini pasti akan menyelesaikan masalah Anda ... Ini berfungsi dengan baik untuk saya ... \
sumber
itu tidak benar. / mnt / sdcard / external_sd dapat tetap ada meskipun kartu SD tidak dipasang. aplikasi Anda akan macet ketika Anda mencoba menulis ke / mnt / sdcard / external_sd ketika tidak dipasang.
Anda perlu memeriksa apakah kartu SD dipasang terlebih dahulu menggunakan:
sumber
getExternalStorageState()
mengembalikan penyimpanan internal daripada kartu SD eksternal, saya kira.sumber
Anda dapat menggunakan sesuatu seperti - Context.getExternalCacheDirs () atau Context.getExternalFilesDirs () atau Context.getObbDirs (). Mereka memberikan direktori khusus aplikasi di semua perangkat penyimpanan eksternal tempat aplikasi dapat menyimpan file-nya.
Jadi, sesuatu seperti ini - Context.getExternalCacheDirs () [i] .getParentFile (). GetParentFile (). GetParentFile (). GetParent () dapat memberi Anda jalur root perangkat penyimpanan eksternal.
Saya tahu perintah ini untuk tujuan yang berbeda tetapi jawaban lain tidak berhasil untuk saya.
Tautan ini memberi saya petunjuk bagus - https://possiblemobile.com/2014/03/android-external-storage/
sumber
System.getenv("SECONDARY_STORAGE")
mengembalikan null untuk Marshmallow. Ini adalah cara lain untuk menemukan semua direktori eksternal. Anda dapat memeriksa apakah itu dapat dilepas yang menentukan apakah internal / eksternalsumber
Saya telah mencoba solusi yang disediakan oleh Dmitriy Lozenko dan Gnathonic di Samsung Galaxy Tab S2 saya (Model: T819Y) tetapi tidak ada yang membantu saya mengambil jalur ke direktori Kartu SD eksternal.
mount
eksekusi perintah berisi jalur yang diperlukan ke direktori Kartu SD eksternal (yaitu / Storage / A5F9-15F4) tetapi tidak cocok dengan ekspresi reguler sehingga tidak dikembalikan. Saya tidak mendapatkan mekanisme penamaan direktori yang diikuti oleh Samsung. Mengapa mereka menyimpang dari standar (yaitu extsdcard) dan menghasilkan sesuatu yang sangat mencurigakan seperti dalam kasus saya (yaitu / Storage / A5F9-15F4) . Apakah ada yang saya lewatkan? Bagaimanapun, mengikuti perubahan ekspresi reguler Gnathonic's solusi membantu saya mendapatkan direktori sdcard yang valid:Saya tidak yakin apakah ini adalah solusi yang valid dan apakah itu akan memberikan hasil untuk tablet Samsung lainnya tetapi itu telah memperbaiki masalah saya untuk saat ini. Berikut adalah metode lain untuk mengambil jalur Kartu SD yang dapat dilepas di Android (v6.0). Saya telah menguji metode ini dengan android marshmallow dan berhasil. Pendekatan yang digunakan di dalamnya sangat mendasar dan pasti akan berfungsi untuk versi lain juga, tetapi pengujian itu wajib. Beberapa wawasan tentang itu akan membantu:
Mohon bagikan jika Anda memiliki pendekatan lain untuk menangani masalah ini. Terima kasih
sumber
Ini akan mendapatkan jalur penyimpanan sekunder sd eksternal.
sumber
sumber
Untuk mengakses file di kartu SD saya , di HTC One X (Android) saya, saya menggunakan jalur ini:
Perhatikan tripple "/"!
sumber
Pada Galaxy S3 Android 4.3, jalur yang saya gunakan adalah ./storage/extSdCard/Card/ dan itu berfungsi . Semoga membantu,
sumber
Langkah-langkah berikut berhasil untuk saya. Anda hanya perlu menulis baris ini:
Baris pertama akan memberi nama direktori sd, dan Anda hanya perlu menggunakannya dalam metode replace untuk string kedua. String kedua akan berisi jalur untuk sd internal dan removable (/ storage / dalam kasus saya) . Saya hanya membutuhkan jalur ini untuk aplikasi saya tetapi Anda dapat melangkah lebih jauh jika Anda membutuhkannya.
sumber