USB cihazına erişime izin vermeden önce Android'in izin istemesi nasıl durdurulur


19

ICS 4.0.3 çalıştıran ve USB ana bilgisayar modu arabirimi üzerinden bir USB aygıtını kontrol eden köklü bir Android tablet üzerinde çalışan bir uygulamam var. Android.hardware.usb.host.xml dosyası / system / etc / izinlerinde bulunur ve her şey harika çalışır. Dışında...

Uygulamayı bir yeniden başlatmanın ardından ilk kez çalıştırıp USB cihazını taktığımda "APPNAME uygulamasının USB cihazına erişmesine izin verilsin mi? [] Bu USB cihazı için varsayılan olarak kullan. Tamam'ı iptal et" ve bir pencere açılır. Cihazı kullanmaya başlamadan önce Tamam'a dokunmam gerekiyor.

Uygulamanın cihazı hemen kullanabilmesi için kullanıcı onayını kapatmam gerekiyor. Bunu nasıl yaparım? Kullanıcı ekrandaki düğmeye dokunarak simüle etmek için bir tuşa basma jeneratörü kullanma hakkında bazı öneriler görünüyorum ama bu tür bir yaklaşımdan kaçınmayı ve onaylama isteğinin gerçekleşmemesi için işleri ayarlamayı tercih ederim.

Muhtemelen tedarikçinin benim için özel bir çekirdek yapısı yapmasını sağlayamıyorum, ancak yazılım yazılım imzalama anahtarını onlardan alabilmeliyim, böylece yardımcı olacaksa uygulamamı bir sistem uygulaması olarak imzalayabilirim.

İlişkili bir sorun: "Bu USB cihazı için varsayılan olarak kullan" kutusunu işaretlemek yardımcı görünmüyor - cihazı çıkarıp tekrar takarsam, onay istemini tekrar alırım. Bu durumda, / dev / bus / usb / 001 / içindeki aygıt numarasının, her zaman çıkarılıp tekrar taktığımda (001, 002, 003 vb.) Her zaman değiştiğini fark ettim.


Uygulamayı / system / app içine dağıtırsanız ne olur? Bunu sistem imzası olan ve olmayan bir şekilde deneyebilirsiniz. Bunu bir yorum olarak yazıyorum çünkü (a) denemedim ve (b) bu ​​dağıtım modelinin sizin için kullanılabilir olup olmadığını bilmiyorum.
Rob Pridham

Yanıtlar:


10

Bu soru ve cevap temel olarak
/programming//a/15151075/588476 nüshasıdır
Örnek bir program ve daha ayrıntılı tartışma için yukarıdaki bağlantıya bakınız.

Bildiğim kadarıyla, USB izin kutusu açılır penceresini almanın iki yolu vardır:

  1. UsbManager.requestPermission (...) kullanarak uygulamanızdan açıkça izin isteyin (...)
  2. Aksesuarınıza bir niyet filtresi kaydedin ve cihaz bağlandığında sistemin izin istemesine izin verin

1 durumunda, izni hatırlamak için açılır pencerede onay kutusunun herhangi bir etkisi olmadığını buldum.

Benim için, yazılımımdan izinlerle ilgili tüm kodları kaldırdım ve sadece intent-filtresini manifest'ime koydum. USB cihazı takıldığında, daha önce izin verilmemişse, USB izin kutusu açılır. Kullanıcı hatırlama kutusunu işaretlemeden Tamam'ı tıklatırsa, cihaz bir sonraki bağlanışında kutu tekrar açılır. Ancak, kullanıcı kutuyu işaretleyip Tamam düğmesine basarsa, kutu bir daha asla görüntülenmemelidir (yazılım kaldırılıp yeniden yüklenmedikçe).

/ Dev / bus / usb / 001 ve sonra 002 vb. Olarak cihazınızla ilgili bir yerde bir hata olup olmadığından emin değilim. hiçbir şey yapma.

İzin pop-up'ını tamamen önleyebileceğiniz herhangi bir yol bilmiyorum. Dediğin gibi android kodunu kazmadan bunu yapmanın bir yolu olmadığından şüpheleniyorum.


1
Emin misiniz? Cihazın fişi çekilip yeniden bağlandığında hala izin isteğini görüyorum. Bu davranış developer.android.com/guide/topics/connectivity/usb/host.html dosyasındaki belgelerle tutarlıdır . "Amaç filtresi kullanma" bölümünde "Kullanıcılar kabul ederse, uygulamanızın cihaz bağlantısı kesilene kadar cihaza otomatik olarak erişme izni vardır"
yazıyor

Nexus 7, Galaxy S3 ve Galaxy Note için kefil olabilirim, bu cihazlarda sadece bir kez kabul etmek zorunda olduğum cihazlarda (Android cihaz ana bilgisayar modunda çalışıyor) - onay kutusunun kararı hatırlamasını sağlamak koşuluyla. Hangi cihazı / android sürümünü kullanıyorsunuz, özel / OEM bir cihaz olduğunu hissediyorum?
Wayne Uroda

Android 4.0.3 lezzetlerini çalıştıran WonderMedia WM8850 orta SOM tabanlı bir OEM 7 inç tablet.
kbro

Amaç filtreleri yalnızca geçerli önyükleme oturumu için çalışır. Evet Telefonuma bir usb cihazı
takıyorum

7

Yorumuma ek olarak, temel Android koduna bir göz attım.

Olası bir cevabım var, ancak en az dört ana uyarı ve engelle:

  1. Denemedim, çünkü elimde uygun herhangi bir USB cihazım yok.
  2. Yeni bir izne ihtiyacınız var
  3. İzin için bir sistem uygulaması olmanız gerekiyor
  4. Kod, genel API'da olmayan bir şeye erişim gerektiriyor

Sıradan pazar sonrası uygulamaları dağıtırsanız bunu unutun!

İlk ön koşul MANAGE_USBizninizin olmasıdır. Burada anlatılır .

Ancak bunun için önkoşullar sistem anahtarıyla imzalamanız ve uygulamanızı / system / app içine yüklemenizdir.

Her neyse, bununla ilgili sorun yoksa, işte bazı kodlar:

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

mDevice eskiden gelen cihazdır.

uidkendi uygulamanızın UID'sidir ve buna bakabilirsiniz. Bunun nasıl yapılacağına bir örnek burada ilk cevaptır .

Hepsi iyi? Hayır ServiceManager, android.os.ServiceManagerbu nedenle herkese açık bir API değildir. Bu örnekte, ellerinizi IUsbManagerservise götürmenin yolu budur (başka yollar da olabilir). Şimdi, dolaşmakta o benim cevap kapsamı dışındadır; eski günlerde yansımayı kullanabilirsiniz, ama yine de yapıp yapamayacağınızı bilmiyorum.

Tüm bu parlaklıklardan sonra, artık izin istemenize gerek yok gibi görünüyor ve eğer yaparsanız, iletişim olmadan hemen geri dönecek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.