Bagaimana cara menghentikan Android meminta izin sebelum mengizinkan akses ke perangkat USB

19

Saya memiliki aplikasi yang berjalan pada tablet Android tanpa nama berakar yang menjalankan ICS 4.0.3 yang mengontrol perangkat USB melalui antarmuka mode host USB. File android.hardware.usb.host.xml ada di / system / etc / permissions dan semuanya bekerja dengan sangat baik. Kecuali...

Ketika saya menjalankan aplikasi untuk pertama kalinya setelah reboot dan kemudian tancapkan perangkat USB saya mendapatkan jendela sembulan yang mengatakan "Izinkan aplikasi APPNAME untuk mengakses perangkat USB? [] Gunakan secara default untuk perangkat USB ini. Batalkan OK" dan Saya harus mengetuk OK sebelum dapat mulai menggunakan perangkat.

Saya perlu mematikan konfirmasi pengguna agar aplikasi dapat langsung menggunakan perangkat. Bagaimana saya melakukan ini? Saya sepertinya memiliki beberapa saran tentang penggunaan generator tombol untuk mensimulasikan pengguna mengetuk tombol di layar, tetapi saya lebih suka menghindari pendekatan semacam itu dan mengatur semuanya sehingga permintaan konfirmasi tidak terjadi.

Saya mungkin tidak dapat meminta pemasok untuk membuat kernel kustom untuk saya, tetapi saya harus bisa mendapatkan kunci penandatanganan firmware dari mereka sehingga saya dapat menandatangani aplikasi saya sebagai aplikasi sistem, jika itu akan membantu.

Satu masalah yang terkait: mencentang kotak "Gunakan secara default untuk perangkat USB ini" tampaknya tidak membantu - jika saya mencabut dan memasang kembali perangkat maka saya mendapatkan konfirmasi lagi. Saya perhatikan dalam situasi ini bahwa nomor perangkat di / dev / bus / usb / 001 / berubah setiap kali saya mencabut dan memasang kembali (001, 002, 003 dll) yang mungkin menjelaskan masalah ini.

kbro
sumber
Apa yang terjadi jika Anda menyebarkan aplikasi ke / sistem / aplikasi? Anda dapat mencoba ini dengan dan tanpa penandatanganan sistem. Saya menulis ini sebagai komentar karena (a) Saya belum mencobanya, dan (b) Saya tidak tahu apakah model penyebaran ini tersedia untuk Anda.
Rob Pridham

Jawaban:

10

Pertanyaan dan jawaban ini pada dasarnya adalah duplikat dari
/programming//a/15151075/588476
Lihat tautan di atas untuk contoh program dan lebih banyak diskusi mendalam.

Sejauh yang saya tahu, ada dua cara untuk mendapatkan popup kotak izin USB:

  1. Minta izin secara eksplisit dari aplikasi Anda menggunakan UsbManager.requestPermission (...)
  2. Daftarkan filter maksud pada aksesori Anda dan biarkan sistem meminta izin ketika perangkat terpasang

Dalam kasus 1 saya telah menemukan bahwa kotak centang pada popup untuk mengingat izin tidak berpengaruh.

Bagi saya, saya menghapus semua kode yang terkait dengan izin dari perangkat lunak saya dan cukup meletakkan filter maksud di manifes saya. Ketika perangkat USB dicolokkan, jika belum diberikan izin maka kotak izin USB akan muncul. Jika pengguna mengklik OK tanpa mencentang kotak ingat, maka kotak akan muncul kembali saat berikutnya perangkat terhubung. Namun jika pengguna mencentang kotak dan menekan OK maka kotak tersebut seharusnya tidak pernah ditampilkan lagi (kecuali jika perangkat lunak dihapus dan kemudian diinstal ulang).

Saya tidak yakin apakah ada bug di suatu tempat yang terkait dengan perangkat Anda muncul sebagai / dev / bus / usb / 001 dll. 002 - beri tahu saya jika Anda menggunakan filter maksud, karena tanpa itu kotak centang ingat akan tidak melakukan apapun.

Saya tidak tahu cara apa pun yang dapat Anda hindari popup izin sama sekali. Saya menduga tidak ada cara untuk melakukannya tanpa menggali ke dalam kode android seperti yang Anda katakan.

Wayne Uroda
sumber
1
Apakah kamu yakin Saya masih melihat permintaan izin ketika perangkat dicabut dan dihubungkan kembali. Perilaku ini konsisten dengan dokumentasi di developer.android.com/guide/topics/connectivity/usb/host.html . Bagian "Menggunakan filter maksud" mengatakan "Jika pengguna menerima, aplikasi Anda secara otomatis memiliki izin untuk mengakses perangkat hingga perangkat terputus"
kbro
Saya hanya dapat menjamin Nexus 7, Galaxy S3 dan Galaxy Note, pada perangkat-perangkat itu saya hanya harus menerima izin satu kali (perangkat Android berjalan dalam mode host) - asalkan saya mengaktifkan kotak centang untuk mengingat keputusan. Apa perangkat / versi android yang Anda gunakan, saya merasa itu adalah perangkat kustom / OEM?
Wayne Uroda
Ini adalah tablet OEM 7-inci berbasis pada WonderMedia WM8850-mid SOM yang menjalankan citarasa Android 4.0.3.
kbro
Intent-filter hanya berfungsi untuk sesi boot saat ini. Ya saya pasang perangkat usb ke telepon saya dan itu memberikan izin secara otomatis
user924
7

Lebih jauh ke komentar saya, saya telah melihat ke dalam kode Android yang mendasarinya.

Saya punya jawaban yang mungkin, tetapi dengan tidak kurang dari empat peringatan utama dan rintangan:

  1. Saya belum mencobanya, karena saya tidak punya perangkat USB yang cocok untuk digunakan.
  2. Anda memerlukan izin baru
  3. Izin mengharuskan Anda menjadi aplikasi sistem
  4. Kode ini membutuhkan akses ke sesuatu yang tidak ada di API publik

Lupakan ini jika menggunakan aplikasi after-market biasa!

Prasyarat pertama adalah Anda memiliki MANAGE_USBizin. Itu dijelaskan di sini .

Namun pada gilirannya prasyarat untuk itu adalah Anda masuk dengan kunci sistem, dan Anda menginstal aplikasi Anda ke / system / app.

Bagaimanapun, jika Anda setuju dengan itu, berikut ini beberapa kode:

   IBinder b = ServiceManager.getService(USB_SERVICE);
   IUsbManager service = IUsbManager.Stub.asInterface(b);
   service.grantDevicePermission(mDevice, uid);

mDevice adalah perangkat dari sebelumnya.

uidadalah UID aplikasi Anda sendiri dan Anda dapat mencarinya. Contoh cara melakukannya adalah jawaban pertama di sini .

Semuanya bagus? Tidak. ServiceManagerIni android.os.ServiceManagerdan karenanya bukan API publik. Itu, dalam contoh ini, adalah cara Anda untuk mendapatkan IUsbManagerlayanan (mungkin ada rute lain). Sekarang, menyiasati hal itu di luar jangkauan jawaban saya; di masa lalu Anda bisa menggunakan refleksi, tetapi saya tidak tahu apakah Anda masih bisa.

Setelah semua kejahatan itu, sepertinya Anda tidak perlu meminta izin lagi, dan jika Anda melakukannya, itu akan segera kembali tanpa dialog.

Rob Pridham
sumber