Penekanan pop-up akses perangkat USB?

Saat perangkat USB tersambung ke tablet Android, muncul pop-up yang meminta izin pengguna. Saya ingin menyembunyikan ini karena klien tidak menginginkannya. Bagaimana saya harus melakukannya?

Dalam kode:

UsbManager.requestpermission(); 

dipanggil untuk memberikan akses sementara pada perangkat USB.

Ini memunculkan pop-up. Bagaimana cara menyembunyikan pop-up atau memberikan akses kepada pengguna secara default?


person Community    schedule 12.09.2012    source sumber


Jawaban (2)


Saat Anda meminta izin di dalam aplikasi Anda, tampaknya kotak centang "gunakan secara default untuk perangkat USB ini" tidak melakukan apa pun (saya tidak yakin mengapa kotak centang ini muncul di munculan ini.

Sebagai gantinya, Anda harus mendaftarkan pengendali maksud untuk aktivitas Anda di manifes:

<activity 
    ...
    ...
    >
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    </intent-filter>
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/usb_device_filter" />  
</activity>

Anda juga harus membuat file filter di sumber daya xml Anda, misalnya res/xml/usb_device_filter:

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <usb-device vendor-id="26214" product-id="26214" />
</resources>

Vendor-id dan product-id di sini harus diberikan dalam desimal - di atas VID dan PID adalah 0x6666.

Apa yang saya berikan di atas juga berfungsi untuk aksesori USB (yaitu, aksesori adalah host USB dan Android adalah perangkatnya) - dalam hal ini filter maksud harus didaftarkan

<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />

dan Anda juga harus memasukkan filter meta data dengan cara yang persis sama.

Lihat http://developer.android.com/guide/topics/connectivity/usb/accessory.html dan cari bagian "Menggunakan filter maksud".

EDIT

Kesimpulannya - jika Anda mendaftarkan filter maksud terhadap aktivitas Anda, jendela izin USB akan segera ditampilkan saat perangkat/aksesori USB terhubung. Jika pengguna mencentang kotak "gunakan secara default untuk perangkat USB ini" lalu memberikan izin, hal ini akan diingat dan dialog izin tidak akan ditampilkan lagi (kecuali aplikasi dihapus instalasinya atau pengguna menghapus tindakan default dari manajer aplikasi ).

Saya telah membuat proyek contoh kecil, buruk, dan berfungsi di sini:

http://www.locusia.com/examples/permissionTest.zip

Anda perlu mengedit res/xml/usb_device_filter.xml, namun jika tidak, ini akan memungkinkan Anda mengujinya dengan sangat cepat.

Untuk layanan...

Tampaknya suatu layanan tidak dapat menerima maksud USB. Saya menyiasatinya dengan membuat aktivitas tersembunyi yang kemudian menyiarkan ulang maksudnya.

Saya mendefinisikannya dalam manifes saya seperti ini:

<activity
    android:name=".activities.UsbEventReceiverActivity"
    android:label="YOUR APPLICATION NAME - This appears in the permission popup"
    android:theme="@style/Theme.Transparent" 
    android:noHistory="true"
    android:excludeFromRecents="true"
    android:taskAffinity="com.example.taskAffinityUsbEventReceiver"
    android:process=":UsbEventReceiverActivityProcess"
    android:exported="false"
    >    
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    </intent-filter>
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/usb_device_filter" />  
</activity>

(Saya memiliki tata letak tugas/proses yang kompleks di layanan saya, YMMV di area itu).

Saya mendefinisikan aktivitas seperti ini:

public class UsbEventReceiverActivity extends Activity
{   
    public static final String ACTION_USB_DEVICE_ATTACHED = "com.example.ACTION_USB_DEVICE_ATTACHED";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onResume()
    {
        super.onResume();

        Intent intent = getIntent();
        if (intent != null)
        {
            if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED))
            {
                Parcelable usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

                // Create a new intent and put the usb device in as an extra
                Intent broadcastIntent = new Intent(ACTION_USB_DEVICE_ATTACHED);
                broadcastIntent.putExtra(UsbManager.EXTRA_DEVICE, usbDevice);

                // Broadcast this event so we can receive it
                sendBroadcast(broadcastIntent);
            }
        }

        // Close the activity
        finish();
    }
}

Dan bagian terakhir dari teka-teki, tema transparan (saya tidak yakin tetapi Anda mungkin bisa menggunakan tema tembus pandang bawaan Android) - res/values/styles.xml:

<?xml version="1.0" encoding="utf-8"?>  
    <resources>  
    <style name="Theme.Transparent" parent="android:Theme">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowAnimationStyle">@null</item>
    </style>  
</resources>  
person Wayne Uroda    schedule 01.03.2013
comment
Untuk Mode Host USB, informasi ini diberikan di developer.android.com/guide /topics/konektivitas/usb/host.html. Bagian Bekerja dengan Perangkat di halaman itu menyatakan bahwa aplikasi harus 2. Minta izin pengguna untuk menyambung ke perangkat USB, jika belum diperoleh. Pertanyaan OP (dan pertanyaan saya!) adalah bagaimana menunjukkan bahwa izin telah diberikan sehingga pop-up TIDAK PERNAH terjadi dan aplikasi dapat segera menggunakan perangkat. - person kbro; 02.03.2013
comment
@kbro ketika Anda mengatakan bahwa izin telah diberikan, apa sebenarnya maksud Anda? Jika izin sudah diberikan, maka fungsi UsbManger.hasPermission() (meneruskan aksesori atau perangkat) akan menghasilkan nilai true, dan Anda tinggal membuka dan menggunakan aksesori/perangkat tersebut. Tidak ada cara untuk menyembunyikan popup sepenuhnya - popup harus muncul setidaknya sekali dan pengguna harus mencentang kotak untuk digunakan secara default untuk perangkat ini dan tekan ya/ok/terima - perhatikan bahwa Anda HARUS mendaftarkan maksudnya- memfilter terhadap suatu aktivitas agar izin diingat terhadap aplikasi Anda. - person Wayne Uroda; 05.03.2013
comment
Saya baru saja menambahkan paragraf lain pada jawaban saya di atas karena mungkin sebelumnya tidak sepenuhnya jelas. - person Wayne Uroda; 05.03.2013
comment
Oke, saya mengerti bahwa Android harus meminta setidaknya sekali, tapi saya tidak bisa mewujudkannya - ia bertanya setiap kali perangkat dilepas dan dimasukkan kembali. Alasannya, menurut saya yang Anda katakan, adalah karena aplikasi memanggil RequestPermission. Saya perlu membalas murni pada filter acara. - person kbro; 08.03.2013
comment
Tapi itu tidak cukup menjawab semuanya, karena ini sepertinya bertentangan dengan bagian Menggunakan filter maksud di developer.android.com/guide/topics/connectivity/usb/host.html - Jika pengguna menyetujuinya, aplikasi Anda secara otomatis memiliki izin untuk mengakses perangkat hingga sambungan perangkat terputus. Itu cukup eksplisit tentang hilangnya izin ketika perangkat terputus. Namun, jika Anda membaca bagian itu dengan cermat maka bagian tersebut tidak menyebutkan kotak centang penggunaan secara default, jadi apakah itu bagian terakhir dari keajaiban yang hilang yang akan membuat ini berfungsi seperti yang saya inginkan? - person kbro; 08.03.2013
comment
Kesimpulannya, jika saya melakukan semuanya PERSIS seperti yang Anda katakan, apakah akan berfungsi sehingga jika saya mencolokkan perangkat USB satu kali, sebelum aplikasi saya berjalan, centang kotak dan ketuk OK, maka saya TIDAK AKAN PERNAH dimintai izin lagi , melalui pelepasan perangkat USB dan reboot tablet, hingga aplikasi diinstal ulang atau ditingkatkan? - person kbro; 08.03.2013
comment
Ya, saya telah menguji pada Galaxy S3 (Android 4.1.1), Galaxy Note (4.0.4) dan Nexus 7 (4.2.2) - Izin harus diterima hanya sekali asalkan kotak centang dicentang - dan ini akan menjadi diingat bahkan melalui siklus reboot/daya. - person Wayne Uroda; 08.03.2013
comment
@kbro Saya mengedit jawaban saya, saya membuat proyek demo yang sangat kecil yang memungkinkan Anda menguji konsep sebelum Anda melakukan refactoring kode Anda. - person Wayne Uroda; 08.03.2013
comment
Anda sangat membantu dan sabar. Saya akan meminta orang-orang SW saya untuk memeriksanya. - person kbro; 08.03.2013
comment
Tidak apa-apa - sebagian besar tempat yang bisa saya bantu di SO sudah banyak orang yang memberikan jawaban, jadi ketika saya menemukan sesuatu, saya tahu saya mencoba membantu sebanyak yang saya bisa :) - person Wayne Uroda; 08.03.2013
comment
Oke, jadi aplikasi Anda berfungsi seperti yang diiklankan, tetapi Anda menggunakan aktivitas sedangkan kode saya adalah layanan, dan meletakkan filter maksud di bagian ‹service› ... ‹/service› pada file AndroidManifect.xml tidak berfungsi. tampaknya tidak memberikan efek apa pun. Pesan yang saya terima juga berbeda - aplikasi pengujian Anda membuka MainActivity saat perangkat USB ini terhubung? sementara milik saya mengatakan Izinkan aplikasi APPNAME mengakses perangkat USB? - person kbro; 10.03.2013
comment
Melihat stackoverflow.com/questions/13466103/, jawabannya menyarankan untuk menggunakan maksud UMS_CONNECTED dan UMS_DISCONNECTED sebagai gantinya. Apakah itu akan membantu kasus saya? - person kbro; 10.03.2013
comment
Silakan lihat info baru di akhir jawaban saya - saya harap ini berhasil untuk Anda. - person Wayne Uroda; 10.03.2013
comment
Tampaknya masuk akal. Terima kasih sekali lagi atas usaha Anda. Saya akan memberi tahu Anda bagaimana kelanjutannya! - person kbro; 10.03.2013
comment
Bagaimana cara kerja pemberian izin otomatis dalam kasus ini - apakah Layanan mendapatkannya karena merupakan bagian dari APK yang sama dengan Aktivitas? - person kbro; 10.03.2013
comment
Saya tidak yakin - apakah izin diberikan berdasarkan aplikasi per aplikasi? Android tidak benar-benar memiliki konsep aplikasi di luar semuanya didefinisikan dalam manifes yang sama - jika saya bilang saya tahu, saya hanya akan menebak-nebak! Yang saya tahu adalah, ini berfungsi, meskipun layanan dan aktivitas berjalan dalam tugas dan proses terpisah. - person Wayne Uroda; 10.03.2013
comment
Saya rasa itulah yang saya maksud dengan bagian dari APK yang sama. Jadi jika layanan dan aktivitas didefinisikan dalam AndroidManifest.xml yang sama (dan menurut saya hanya ada satu di file APK) maka pemberian izin otomatis berfungsi. Cantik!! Sekarang jika saya bisa membuat StackOverflow mengirimi saya email ketika komentar baru diposting maka saya akan berada di surga :-) - person kbro; 10.03.2013
comment
Aha - menemukannya. Di bawah StackExchange di sebelah kiri bilah di bagian atas halaman, tidak ada hubungannya dengan profil saya - lihat! - person kbro; 10.03.2013
comment
@WayneUroda Saya telah mencoba contoh Anda dan saya berhasil mengintegrasikan dalam kode saya dan dialog USB tidak muncul untuk kedua kalinya tetapi di sini ada satu masalah lagi dengan aktivitas, aktivitas di mana saya membuat IntentFilter dari USB Terlampir dimulai jika saya di tempat lain layar. di sini saya tidak ingin memulainya jika saya sedang melakukan aktivitas lain - person Nikunj Patel; 09.01.2014
comment
@NikPatel Contoh saya mencakup hal ini - cukup gunakan instruksi untuk layanan - ini menciptakan aktivitas tersembunyi (tidak muncul dalam riwayat, tidak muncul di layar) yang finished segera setelah dimulai. - person Wayne Uroda; 13.01.2014
comment
@WayneUroda bisakah Anda menjelaskannya lebih lanjut - person Nikunj Patel; 13.01.2014
comment
@NikPatel membuat aktivitas tersembunyi - yaitu, aktivitas yang tidak muncul di riwayat (android:noHistory="true" android:excludeFromRecents="true" dalam manifes Anda) dan kemudian memasukkan aktivitas finish itu sendiri ke dalam fungsi onresume (sehingga aktivitas tersebut tidak pernah aktif/di atas). Anda juga dapat memberikan aktivitas tema transparan tanpa animasi sehingga OS tidak menggambar transisi. Terserah Anda bagaimana Anda ingin aktivitas tersebut melakukan tugasnya - aktivitas tersebut dapat memunculkan rangkaian pesan baru, menyiarkan maksud ke bagian lain dari aplikasi Anda, atau sesuatu yang lain sama sekali. - person Wayne Uroda; 13.01.2014
comment
@WayneUroda yap Saya akan mencoba hal yang sama dan memberi tahu Anda terima kasih :) - person Nikunj Patel; 13.01.2014
comment
di sini ada satu masalah dengan aplikasi, saya ingin menampilkan dialog ketika cetakan sudah keluar. jadi sebenarnya ketika saya mencetak seharusnya terlihat dialog saya dan ketika saya sedang melakukan aktivitas lain dan mencolokkan kabel usb seharusnya tidak ada efek apa pun... setelah mencoba contoh ini saya masih belum mencapainya. bisakah kamu membantuku dalam hal ini - person Nikunj Patel; 20.01.2014
comment
@WayneUroda: Setelah koneksi usb antara Android dan perangkat usb terjalin, apakah koneksi ini akan bertahan selamanya? Saya menguji kode saya dengan memulai koneksi yang berhasil dan menyimpannya seperti itu semalaman. Hari berikutnya saya melihat bahwa saya tidak dapat mengirim data apa pun melalui koneksi usb. Saya berasumsi koneksi terputus setelah beberapa saat. Apakah ini normal, atau apakah saya perlu untuk mengirim sinyal tiruan secara berkala antara perangkat Android dan usb untuk menjaga koneksi dalam keadaan hidup/aktif? - person Basher51; 03.07.2014
comment
@WayneUroda: Selain itu, dalam kasus saya, saya memiliki penerima siaran alih-alih aktivitas/layanan, yang mendengarkan maksud usb terpasang/izin. Sejauh ini semuanya berfungsi dengan baik & penerima saya menerima maksud tersebut saat reboot perangkat. Saya hanya perlu untuk menonaktifkan kemunculan kembali popup izin usb. Apakah saya perlu menggunakan aktivitas transparan tersebut untuk kasus saya? Selain itu, apakah popup ini akan muncul kembali saat aplikasi diperbarui? Mohon bantu saya, karena saya hampir mendapatkan soln. Terima kasih. - person Basher51; 03.07.2014
comment
Terima kasih, hampir berhasil untuk saya. Namun, untuk memulai layanan, saya harus membuat Intent menjadi eksplisit (memasok this, null, MyService.class sebagai argumen tambahan) dan menggunakan startService() daripada sendBroadcast()—barulah layanan benar-benar dimulai. - person user149408; 29.05.2017
comment
Saya telah menggunakan aktivitas tak kasat mata ini selama beberapa tahun. Namun kini, muncul satu masalah yaitu perangkat usb_device_filter.xml digunakan untuk beberapa aplikasi. Kemudian ketika saya mencolokkan USB, pemilih aktivitas akan ditampilkan, saya harus memilih salah satu aktivitas yang tidak terlihat, jika tidak, izin tidak akan diberikan. Oleh karena itu, saya ingin tahu apakah saya dapat menggunakan penerima tetapi bukan aktivitas yang tidak terlihat (kita sudah tahu bahwa layanan tidak berfungsi)? Bisakah penerima yang dideklarasikan di manifes dapat diluncurkan dari plug-in perangkat usb (didefinisikan pada usb_device_filter.xml)? - person Yeung; 30.01.2018
comment
Saya telah mengikuti ini dan menggunakan ID Vendor dan ID Produk yang benar, namun tetap saja setiap kali perangkat USB (Arduino Teensy) dicabut dari telepon, aplikasi memerlukan izin lagi. Apakah ada sesuatu yang saya lewatkan. Untuk lebih jelasnya saya memulai pertanyaan baru: stackoverflow.com/q/54298521 - person Wowsk; 24.01.2019
comment
bagi saya ini berfungsi, tetapi jika perangkat memulai ulang, dialog konfirmasi akan muncul. Saya telah menginstal aplikasi ke folder System/priv-app - person Jemo Mgebrishvili; 12.03.2019
comment
@WayneUroda bagaimana cara mengingat izin setelah reboot? - person user924; 22.08.2019
comment
@WayneUroda, Hai, Saya menggunakan fragmen tempat saya meminta izin USB untuk perangkat Biometrik. Sekarang, jika saya menggunakan kode Anda, saya harus meneruskan filter maksud ke Aktivitasnya dan itu mengarahkan saya ke Aktivitas tertentu jika saya mengikuti langkah-langkah Anda dalam dialog izin. Tolong bimbing saya tentang bagaimana saya bisa melakukannya dalam sebuah fragmen - person Priyanka Alachiya; 19.03.2020
comment
fyi: Anda dapat mengetahui id vendor dan id produk dari adb logcat. cukup sambungkan perangkat dan periksa di sana - person nexus; 05.04.2020

Terlambat tetapi saya berharap dapat membantu. dokumen Android resmi menyatakan "Saat pengguna menghubungkan perangkat yang cocok dengan perangkat Anda filter, sistem menampilkan dialog yang menanyakan apakah mereka ingin memulai aplikasi Anda. Jika pengguna menerimanya, aplikasi Anda secara otomatis memiliki izin untuk mengakses perangkat hingga perangkat terputus.". Jika Anda juga mencentang kotak untuk mengingat perangkat, izin diberikan hingga aplikasi dicopot pemasangannya atau data dihapus melalui manajer aplikasi.

Jadi, Anda harus melakukan:

  1. Tambahkan filter maksud seperti kata Wayne, (dan hapus semua tentang izin di aktivitas utama Anda).
  2. Instal aplikasi dan TUTUP.
  3. Cabut dan colokkan usb Anda.
  4. Terima izin dan centang kotak untuk mengingat perangkat.
  5. Menikmati.
person jlbofh    schedule 07.05.2019
comment
Apakah Anda punya saran jika Anda mengharapkan kabel USB sudah terpasang saat dinyalakan? Saya telah menerapkan pendekatan ini, dan akan berfungsi dengan baik jika saya menyambungkan kabel USB setelah dinyalakan, namun dalam kasus saya, saya mengharapkan kabel tetap terpasang sepanjang waktu. - person Ryan Tensmeyer; 19.05.2021