Saya mencari cara untuk membagikan (bukan OPEN) file internal dengan aplikasi eksternal menggunakan FileProvider pustaka Dukungan Android .
Mengikuti contoh pada dokumen,
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.android.supportv4.my_files"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_paths" />
</provider>
dan menggunakan ShareCompat untuk berbagi file ke aplikasi lain sebagai berikut:
ShareCompat.IntentBuilder.from(activity)
.setStream(uri) // uri from FileProvider
.setType("text/html")
.getIntent()
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
tidak berfungsi, karena FLAG_GRANT_READ_URI_PERMISSION hanya memberikan izin untuk Uri yang ditentukan pada data
maksud, bukan nilai EXTRA_STREAM
tambahan (seperti yang ditetapkan oleh setStream
).
Saya mencoba untuk keamanan kompromi dengan menetapkan android:exported
untuk true
untuk penyedia, tetapi FileProvider
secara internal memeriksa apakah itu sendiri diekspor, ketika begitu, itu melempar pengecualian.
android
android-contentprovider
android-support-library
android-fileprovider
Randy Sugianto 'Yuku'
sumber
sumber
Jawaban:
Menggunakan
FileProvider
dari pustaka dukungan, Anda harus memberikan dan mencabut izin secara manual (saat runtime) agar aplikasi lain dapat membaca Uri tertentu. Gunakan Context.grantUriPermission dan Context.revokeUriPermission metode.Sebagai contoh:
Sebagai upaya terakhir, jika Anda tidak dapat memberikan nama paket, Anda dapat memberikan izin untuk semua aplikasi yang dapat menangani maksud tertentu:
Metode alternatif sesuai dengan dokumentasi :
Btw. jika perlu, Anda dapat menyalin sumber FileProvider dan mengubah
attachInfo
metode untuk mencegah penyedia memeriksa apakah itu diekspor.sumber
grantUriPermission
metode ini kita perlu memberikan nama paket aplikasi yang ingin kita beri izin. Namun, ketika berbagi, biasanya kita tidak tahu aplikasi apa tujuan berbagi itu.Contoh kode yang berfungsi penuh cara berbagi file dari folder aplikasi dalam. Diuji pada Android 7 dan Android 5.
AndroidManifest.xml
xml / provider_paths
Kode itu sendiri
sumber
ShareCompat.IntentBuilder
dan izin baca URI akhirnya melakukannya untuk saya.FileProvider
yang berfungsi. Jawaban lainnya mendapatkan maksud penanganan yang salah (tidak digunakanShareCompat.IntentBuilder
), dan niat itu tidak dapat dibuka oleh aplikasi eksternal dengan cara apa pun yang bermakna. Saya telah menghabiskan sebagian besar hari ini untuk omong kosong ini sampai akhirnya menemukan jawaban Anda.Solusi ini bekerja untuk saya sejak OS 4.4. Untuk membuatnya berfungsi di semua perangkat saya menambahkan solusi untuk perangkat yang lebih lama. Ini memastikan bahwa selalu solusi teraman digunakan.
Manifest.xml:
file_paths.xml:
Jawa:
Izin dicabut dengan revokeFileReadPermission () di metode onResume dan onDestroy () dari Fragment atau Activity.
sumber
file
tidak akan berubah darionResume
menjadionDestroy
?Karena seperti yang dikatakan Phil dalam komentarnya pada pertanyaan awal, ini unik dan tidak ada info lain tentang SO di google, saya pikir saya juga harus membagikan hasil saya:
Dalam aplikasi saya FileProvider bekerja di luar kotak untuk berbagi file menggunakan maksud berbagi. Tidak diperlukan konfigurasi atau kode khusus, selain itu untuk mengatur FileProvider. Di manifest.xml saya menempatkan:
Di my_paths.xml saya punya:
Dalam kode saya, saya punya:
Dan saya dapat berbagi penyimpanan file di aplikasi pribadi saya dengan aplikasi seperti Gmail dan google drive tanpa masalah.
sumber
Sejauh yang saya tahu ini hanya akan bekerja pada versi Android yang lebih baru, jadi Anda mungkin harus mencari cara yang berbeda untuk melakukannya. Solusi ini berfungsi untuk saya pada 4.4, tetapi tidak pada 4.0 atau 2.3.3, jadi ini bukan cara yang berguna untuk berbagi konten untuk aplikasi yang dimaksudkan untuk berjalan pada perangkat Android apa pun.
Dalam manifes.xml:
Perhatikan bagaimana Anda menentukan otoritas. Anda harus menentukan aktivitas dari mana Anda akan membuat URI dan meluncurkan niat berbagi, dalam hal ini kegiatan ini disebut SharingActivity. Persyaratan ini tidak jelas dari dokumen Google!
file_paths.xml:
Hati-hati dengan cara Anda menentukan jalur. Default di atas adalah akar dari penyimpanan internal pribadi Anda.
Di SharingActivity.java:
Dalam contoh ini kami membagikan gambar JPEG.
Akhirnya mungkin ide yang bagus untuk meyakinkan diri sendiri bahwa Anda telah menyimpan file dengan benar dan Anda dapat mengaksesnya dengan sesuatu seperti ini:
sumber
Dalam aplikasi saya, FileProvider berfungsi dengan baik, dan saya dapat melampirkan file internal yang disimpan dalam direktori file ke klien email seperti Gmail, Yahoo, dll.
Dalam manifes saya sebagaimana disebutkan dalam dokumentasi Android saya menempatkan:
Dan karena file saya disimpan di direktori file root, filepaths.xml adalah sebagai berikut:
Sekarang dalam kode:
Ini bekerja untuk saya. Semoga ini membantu :)
sumber
Jika Anda mendapatkan gambar dari kamera, tidak ada solusi ini yang berfungsi untuk Android 4.4. Dalam hal ini lebih baik memeriksa versi.
sumber
hanya untuk meningkatkan jawaban yang diberikan di atas: jika Anda mendapatkan NullPointerEx:
Anda juga dapat menggunakan getApplicationContext () tanpa konteks
sumber
Saya ingin berbagi sesuatu yang memblokir kami selama beberapa hari: kode fileprovider HARUS dimasukkan di antara tag aplikasi, bukan setelahnya. Ini mungkin sepele, tetapi tidak pernah ditentukan, dan saya pikir saya bisa membantu seseorang! (sekali lagi terima kasih kepada piolo94)
sumber