Android 11: Bagaimana/di mana menulis file media campuran yang dapat bertahan jika dihapus instalasinya

Saya sedang menulis aplikasi kamera kasus penggunaan khusus yang menargetkan Android 11. Ketika saya mencapai rekor, saya ingin membuat direktori baru di suatu tempat (dengan nama berdasarkan stempel waktu dll) yang berisi video yang dihasilkan serta seluruh tumpukan file YAML/JSON/CSV khusus lainnya yang juga ditulis selama proses perekaman (secara logis termasuk dalam keluaran rekaman).

Saya ingin semua file yang dihasilkan tetap bertahan ketika aplikasi dicopot/diinstal ulang karena saya tidak ingin mengambil risiko pengguna kehilangan semua yang pernah mereka rekam jika mereka mencopot pemasangan aplikasi. Bagaimana cara melakukan ini dengan perubahan penyimpanan terbatas baru, dll di Android 11?

Melihat ikhtisar di sini, saya dapat melihat bahwa:

  • File khusus aplikasi, Preferensi aplikasi dan Database jelas tidak cocok karena antara lain file-file ini tidak dapat bertahan jika di-uninstal
  • Dokumen dan file lain menggunakan Storage Access Framework, namun ini tidak cocok karena memerlukan pemilih file sistem setiap kali Anda ingin menulis sesuatu. Hal ini akan mengganggu alur perekaman/pengalaman pengguna, dan tidak ada aplikasi kamera yang berfungsi seperti itu.
  • Datasets/BlobStoreManager (di sini) juga tidak sesuai untuk kasus penggunaan saya.
  • MediaStore API sepertinya memang seharusnya menjadi satu-satunya, tetapi sepertinya tidak dapat melakukan apa yang saya inginkan dalam hal menghasilkan seluruh direktori keluaran, termasuk file teks YAML/JSON/CSV khusus, itu saja milik bersama. Tujuan saya adalah agar pengguna setiap saat cukup membuka file explorer, menavigasi ke folder yang sesuai, dan cukup menyalin folder dengan rekaman ke komputer mereka atau apa pun, untuk menyimpan/melihat data. Bahkan MediaStore.Files tampaknya tidak menjamin Anda benar-benar dapat melakukan hal tersebut jika aplikasi Anda menggunakan penyimpanan terbatas.

Satu-satunya pilihan yang tersisa adalah menggunakan MANAGE_EXTERNAL_STORAGE dan meletakkan data di mana pun saya inginkan di direktori home, tapi itu sepertinya izin ekstrem yang harus diminta hanya agar dapat menyimpan beberapa file teks bersama dengan video yang saya produksi. Selain itu, izin itu khusus untuk Android 11. Jika saya ingin mendukung versi Android yang lebih lama, apa yang harus saya lakukan?

Apa pilihan terbaik saya di sini? Apakah ada opsi yang saya lewatkan?


person pallgeuer    schedule 10.01.2021    source sumber
comment
MANAGE_EXTERNAL_STORAGE juga sangat tidak diinginkan karena ini: developer.android.com/training/data-storage/   -  person pallgeuer    schedule 10.01.2021


Jawaban (2)


tetapi ini kurang cocok karena memerlukan pemilih file sistem setiap kali Anda ingin menulis sesuatu

No.

Gunakan ACTION_OPEN_DOCUMENT_TREE untuk membiarkan pengguna memilih pohon dokumen. Di sana, Anda dapat membuat subpohon Anda sendiri dan memasukkan dokumen Anda sendiri ke dalam subpohon tersebut. Anda tidak memerlukan pemilih file sistem untuk apa pun selain permintaan ACTION_OPEN_DOCUMENT_TREE awal itu sendiri. Dan dokumen yang dihasilkan akan bertahan jika dihapus instalasinya.

person CommonsWare    schedule 10.01.2021
comment
Apakah pemahaman saya benar bahwa aplikasi hanya perlu membiarkan pengguna memilih pohon dokumen satu kali saja? Atau apakah pengguna perlu memilih pohon dokumen satu kali untuk menjalankan aplikasi? Sekali per pembaruan aplikasi? Sekali per aplikasi instal ulang? - person pallgeuer; 11.01.2021
comment
Hanya sekali saja. Dan satu==satu. - person blackapps; 11.01.2021
comment
@pallgeuer: Anda perlu meminta ulang pohon tersebut jika aplikasi Anda dicopot pemasangannya dan dipasang ulang. Ada kasus ekstrim di mana Anda perlu meminta ulang pohon, seperti jika pengguna menghapus pohon asli. Jika tidak, jika Anda menggunakan takePersistableUriPermission(), Anda akan memiliki akses jangka panjang ke pohon tersebut. - person CommonsWare; 11.01.2021
comment
@CommonsWare, apakah ada contoh kode yang berfungsi untuk menulis file di penyimpanan eksternal dan kemudian membaca file dari lokasi itu untuk semua api termasuk Android 11? dan pertanyaan tambahan untuk membaca dokumen itu. Jika saya harus bertanya kepada pengguna setiap saat? atau sekali? bagaimana caranya? - person Noor Hossain; 15.02.2021

Anda dapat membuat direktori Anda sendiri di direktori publik seperti DCIM, Gambar, Musik, atau Film dengan metode File klasik.

person blackapps    schedule 10.01.2021
comment
Ya, tapi kecuali saya salah, seperti yang saya katakan, hal itu memerlukan izin MANAGE_EXTERNAL_STORAGE, yang bukan merupakan opsi: support.google.com/googleplay/android-developer/answer/9956427 - person pallgeuer; 11.01.2021
comment
Tidak. Itu tidak memerlukan hal itu. Dan kenapa kamu belum mencobanya? - person blackapps; 11.01.2021
comment
Ya, benar, dan seperti yang didokumentasikan dengan jelas dalam dokumentasi Android, upaya penulisan file klasik gagal (dengan operasi EPERM tidak diizinkan). Itu hanya menyisakan opsi untuk menambahkan WRITE_EXTERNAL_STORAGE atau MANAGE_EXTERNAL_STORAGE dengan harapan berhasil, dan jika Anda membaca dokumentasinya, Anda dapat melihat: jika aplikasi Anda menargetkan Android 11 (API level 30) atau lebih tinggi, izin WRITE_EXTERNAL_STORAGE tidak memilikinya berpengaruh pada akses aplikasi Anda ke penyimpanan. Mungkin Anda tidak tahu bahwa banyak hal telah berubah di Android 11? - person pallgeuer; 11.01.2021
comment
Tunjukkan kode Anda. Anda tidak dapat membuat file di direktori tersebut di Android 11. Namun Anda dapat membuat folder sendiri di sana dan kemudian Anda dapat membuat file di folder Anda. Kami tidak tahu apa yang Anda lakukan. Anda memerlukan izin biasa seperti sebelum Android 10. - person blackapps; 11.01.2021
comment
Saya menggunakan Environment.getExternalStoragePublicDirectory(...) untuk mendapatkan direktori DCIM (ini sudah tidak digunakan lagi - bagaimana cara menggantinya?) lalu File::mkdir untuk membuat folder di DCIM. Itu berhasil. Membuat FileWriter ke file di jalur itu gagal dengan java.io.FileNotFoundException: /storage/emulated/0/DCIM/blah/stuff.yaml: open failed: EPERM (Operation not permitted) di mana saya memeriksa di pengelola file bahwa folder bla memang ada dari mkdir sebelumnya. Untuk memastikan, saya juga mencobanya setelah berhasil menerapkan izin WRITE_EXTERNAL_STORAGE ke aplikasi saya (saya mengetuk izinkan). - person pallgeuer; 11.01.2021
comment
Jadi, jika Anda memiliki kode yang berhasil melakukan apa yang Anda klaim mungkin dilakukan (diuji pada Android 11), silakan posting kode tersebut untuk kepentingan komunitas! - person pallgeuer; 11.01.2021
comment
Kode yang sama persis dengan yang saya coba berfungsi dengan baik jika aplikasi memiliki izin MANAGE_EXTERNAL_STORAGE, jadi yang pasti bukan kesalahan ketik kode. Namun mendapatkan izin tersebut untuk aplikasi seperti milik saya tidak dimungkinkan dengan kebijakan baru Google. - person pallgeuer; 11.01.2021
comment
Coba /storage/emulated/0/DCIM/blah/stuff.jpg karena tidak semua jenis file diperbolehkan di DCIM. - person blackapps; 11.01.2021
comment
Menggunakan folder Anda sendiri di direktori Dokumen, Anda dapat menulis file *.yaml. Anda harus mencoba dan menguji lebih banyak! - person blackapps; 11.01.2021
comment
Pengujian bukanlah sinonim untuk menebak perilaku rapuh yang tidak terdokumentasikan, dan seharusnya tidak demikian. Bagaimanapun, saya dapat mengonfirmasi jpg di subfolder DCIM berfungsi dan yaml di subfolder Dokumen berfungsi. Meskipun demikian, tidak disarankan untuk mengandalkan perilaku tidak terdokumentasi seperti itu dalam aplikasi serius yang ingin dipertahankan selama bertahun-tahun. - person pallgeuer; 12.01.2021