Saya memiliki jenis / ekstensi file khusus yang ingin saya kaitkan dengan aplikasi saya.
Sejauh yang saya tahu, elemen data dibuat untuk tujuan ini, tetapi saya tidak bisa membuatnya berfungsi. http://developer.android.com/guide/topics/manifest/data-element.html Menurut dokumen, dan banyak posting forum, seharusnya berfungsi seperti ini:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="application/pdf" />
</intent-filter>
Yah, itu tidak berhasil. Apa kesalahan yang telah aku perbuat? Saya hanya ingin mendeklarasikan jenis file saya sendiri.
Jawaban:
Anda memerlukan beberapa filter maksud untuk mengatasi situasi berbeda yang ingin Anda tangani.
Contoh 1, tangani permintaan http tanpa mimetypes:
Tangani dengan mimetypes, yang sufiksnya tidak relevan:
Tangani maksud dari aplikasi browser file:
sumber
Solusi lain tidak bekerja dengan andal untuk saya sampai saya menambahkan:
Sebelum itu berfungsi di beberapa aplikasi, di beberapa tidak ...
solusi lengkap untuk saya:
sumber
mimeType
dan satu tanpa jika Anda ingin menjadi lengkap. Lihat developer.android.com/guide/components/…Jawaban yang diberikan oleh Phyrum Tea dan yuku sudah sangat informatif.
Saya ingin menambahkannya dimulai dengan Android 7.0 Nougat ada perubahan pada cara penanganan file sharing antar aplikasi:
Dari Perubahan Android 7.0 resmi :
Jika Anda memiliki file kustom Anda sendiri yang diakhiri tanpa spesifik
mime-type
(atau saya kira bahkan dengan satu) Anda mungkin harus menambahkanscheme
nilai kedua ke Andaintent-filter
untuk membuatnya bekerjaFileProviders
juga.Contoh:
Yang penting di sini adalah penambahan
ke filter.
Saya mengalami kesulitan mencari tahu tentang perubahan kecil ini yang membuat aktivitas saya tidak terbuka di perangkat Android 7.0 sementara semuanya baik-baik saja di versi yang lebih lama. Saya harap ini membantu seseorang.
sumber
File(uri.path)
, itu akan macet karenaNo such file or directory
- harus menangani skenario itu secara berbeda saat memperbarui untuk mendukung Nougat +!Temuan saya:
Anda memerlukan beberapa filter untuk menangani berbagai cara mengambil file. yaitu, dengan lampiran gmail, dengan file explorer, dengan HTTP, dengan FTP ... Mereka semua mengirimkan maksud yang sangat berbeda.
Dan Anda perlu memfilter maksud yang memicu aktivitas Anda di kode aktivitas.
Untuk contoh di bawah ini, saya membuat file palsu dengan tipe new.mrz. Dan saya mengambilnya dari lampiran gmail dan file explorer.
Kode aktivitas ditambahkan di onCreate ():
Filter lampiran Gmail:
Filter penjelajah file:
Filter HTTP:
Fungsi pribadi yang digunakan di atas:
sumber
Itu
pathPattern
tidak berfungsi jika jalur file berisi satu atau lebih titik sebelum ".pdf".
Ini akan berhasil:
Tambahkan lebih banyak jika Anda ingin mendukung lebih banyak titik.
sumber
Saya sudah mencoba membuat ini berfungsi selama berabad-abad dan pada dasarnya telah mencoba semua solusi yang disarankan dan masih tidak bisa membuat Android mengenali ekstensi file tertentu. Saya memiliki filter-maksud dengan
"*/*"
mimetype yang merupakan satu-satunya hal yang tampaknya berfungsi dan file-browser sekarang mencantumkan aplikasi saya sebagai opsi untuk membuka file, namun aplikasi saya sekarang ditampilkan sebagai opsi untuk membuka APAPUN file meskipun Saya telah menentukan ekstensi file tertentu menggunakan tag pathPattern. Sejauh ini bahkan ketika saya mencoba untuk melihat / mengedit kontak di daftar kontak saya Android bertanya apakah saya ingin menggunakan aplikasi saya untuk melihat kontak, dan itu hanya salah satu dari banyak situasi di mana hal ini terjadi, SANGAT SANGAT mengganggu.Akhirnya saya menemukan posting grup google ini dengan pertanyaan serupa yang dijawab oleh insinyur kerangka Android yang sebenarnya. Dia menjelaskan bahwa Android sama sekali tidak tahu apa-apa tentang ekstensi file, hanya jenis MIME ( https://groups.google.com/forum/#!topic/android-developers/a7qsSl3vQq0 ).
Jadi dari apa yang saya lihat, coba dan baca, Android tidak bisa membedakan antara ekstensi file dan tag pathPattern pada dasarnya adalah pemborosan waktu dan energi yang sangat besar. Jika Anda cukup beruntung karena hanya membutuhkan file dengan jenis mime tertentu (misalnya teks, video, atau audio), Anda dapat menggunakan filter maksud dengan jenis mime. Jika Anda memerlukan ekstensi file tertentu atau jenis mime yang tidak dikenal oleh Android, Anda kurang beruntung.
Jika saya salah tentang semua ini, tolong beri tahu saya, sejauh ini saya telah membaca setiap posting dan mencoba setiap solusi yang diusulkan yang dapat saya temukan tetapi tidak ada yang berhasil.
Saya dapat menulis satu atau dua halaman lagi tentang seberapa umum hal-hal semacam ini tampaknya ada di Android dan betapa mengacaukan pengalaman pengembang, tetapi saya akan menyelamatkan Anda dari kata-kata kasar saya;). Semoga saya menyelamatkan seseorang dari masalah.
sumber
Markus Ressel benar. Android 7.0 Nougat tidak lagi mengizinkan berbagi file antar aplikasi menggunakan URI file. URI konten harus digunakan. Namun, URI materi tidak mengizinkan jalur file untuk dibagikan, hanya jenis mime. Jadi, Anda tidak dapat menggunakan URI konten untuk mengaitkan aplikasi Anda dengan ekstensi file Anda sendiri.
Drobpox memiliki perilaku yang menarik di Android 7.0. Ketika bertemu dengan ekstensi file yang tidak dikenal, ia tampak membentuk maksud URI file tetapi bukannya meluncurkan maksud itu memanggil sistem operasi untuk mencari tahu aplikasi mana yang bisa menerima maksud tersebut. Jika hanya ada satu aplikasi yang dapat menerima URI file tersebut, maka URI konten eksplisit akan dikirim langsung ke aplikasi tersebut. Jadi untuk bekerja dengan Dropbox Anda tidak perlu mengubah filter maksud di aplikasi Anda. Ini tidak memerlukan filter maksud URI materi. Pastikan saja aplikasi tersebut dapat menerima URI konten dan aplikasi Anda dengan ekstensi file Anda sendiri akan bekerja dengan Dropbox seperti sebelum Android 7.0.
Berikut adalah contoh kode pemuatan file saya yang dimodifikasi untuk menerima URI konten:
sumber
Anda mencoba ini, itu akan membantu Anda. Alih-alih pdf Anda juga dapat menggunakan ekstensi lain. Pertama, Anda harus menambahkan izin baca penyimpanan eksternal di file androidmanifest.xml .
Kemudian di file androidmanifest di tag Activity, Anda menambahkan intent-filter seperti yang ditunjukkan di bawah ini.
Terakhir di kode Anda, Anda mendapatkan jalur file pdf seperti yang ditunjukkan di bawah ini:
sumber
Coba tambahkan
sumber
Untuk lampiran Gmail, Anda dapat menggunakan:
Tambahkan jenis pantomim sebanyak yang Anda butuhkan. Saya hanya membutuhkan itu untuk proyek saya.
sumber
Perhatikan bahwa ini akan membuat aplikasi Anda membuka semua lampiran file gmail, tidak ada cara untuk mengatasinya
sumber
Mereka yang mengalami masalah dengan aplikasi File Manager \ Explorer lainnya, seperti yang dijawab @yuku dan @ phyrum-tea
Ini berfungsi dengan aplikasi pengelola file default LG
tetapi tidak dapat bekerja dengan ES File Explorer dan Manajer File lainnya jadi saya menambahkan
kemudian berfungsi dengan ES Explorer tetapi pengelola file LG tidak dapat mendeteksi jenis file jadi solusi saya adalah
sumber
URI materi ftw, dan dengan filter maksud dalam manifes ... jika file Anda memiliki ekstensi khusus .xyz, tambahkan jenis mime yang cocok:
Beberapa aplikasi seperti email tampaknya mengubah ekstensi menjadi jenis pantomim. Sekarang saya dapat mengklik lampiran di email dan membukanya di aplikasi saya.
sumber
Baca membuka file di kotlin:
sumber
Letakkan filter maksud ini di dalam tag aktivitas dalam manifes yang ingin Anda buka dengan menyentuh file:
sumber
// Saya sudah mencoba kode ini. Dan itu bekerja dengan baik. Anda dapat menggunakan kode ini untuk menerima file pdf.
sumber