it-swarm.com.de

Popup-Unterdrückung des USB-Gerätezugriffs?

Wenn ein USB-Gerät an das Android Tablet angeschlossen ist, wird ein Popup-Fenster angezeigt, in dem Sie um die Erlaubnis des Benutzers gebeten werden. Ich möchte dies unterdrücken, da der Client dies nicht möchte. Wie soll ich vorgehen? ?

Im Code:

UsbManager.requestpermission(); 

wird aufgerufen, um dem USB-Gerät vorübergehenden Zugriff zu gewähren.

Dies löst ein Popup aus. Wie kann ich das Popup unterdrücken oder dem Benutzer standardmäßig Zugriff gewähren?

46
venkat

Wenn Sie in Ihrer App um Erlaubnis bitten, scheint das Kontrollkästchen "Standardmäßig für dieses USB-Gerät verwenden" nichts zu bewirken (ich bin mir nicht sicher, warum dieses Kontrollkästchen in diesem Popup überhaupt angezeigt wird).

Stattdessen sollten Sie einen Intent-Handler für Ihre Aktivität im Manifest registrieren:

<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>

Sie müssen auch eine Filterdatei in Ihren XML-Ressourcen erstellen, z. B. res/xml/usb_device_filter:

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

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

Die Vendor-ID und die Product-ID müssen hier in Dezimalzahlen angegeben werden. Sowohl die VID als auch die PID sind 0x6666.

Was ich oben angegeben habe, funktioniert auch für ein USB-Zubehör (das heißt, das Zubehör ist der USB-Host und das Android ist das Gerät) - in diesem Fall sollte der Intent-Filter registriert werden

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

auf die gleiche Weise müssen Sie auch den Metadatenfilter einbinden.

Siehe http://developer.Android.com/guide/topics/connectivity/usb/accessory.html und suchen Sie nach dem Abschnitt "Verwenden eines Absichtsfilters".

[~ # ~] edit [~ # ~]

Fazit: Wenn Sie den Absichtsfilter für Ihre Aktivität registrieren, wird das USB-Berechtigungsfenster sofort angezeigt, wenn das USB-Gerät/-Zubehör angeschlossen wird. Wenn der Benutzer das Kontrollkästchen "Standardmäßig für dieses USB-Gerät verwenden" aktiviert und dann die Berechtigung erteilt, wird dies gespeichert und der Berechtigungsdialog wird nicht erneut angezeigt (es sei denn, die App wurde deinstalliert oder der Benutzer löscht die Standardaktion aus dem Anwendungsmanager ).

Ich habe hier ein kleines, schreckliches, funktionierendes Beispielprojekt aufgestellt:

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

Sie müssen die Datei res/xml/usb_device_filter.xml bearbeiten, andernfalls sollten Sie sie sehr schnell testen können.

Für Dienstleistungen ...

Es scheint, dass ein Dienst die USB-Absichten nicht empfangen kann. Ich habe das umgangen, indem ich eine versteckte Aktivität gemacht habe, bei der die Absichten erneut übertragen wurden.

Ich definiere es in meinem Manifest so:

<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>

(Ich habe ein komplexes Aufgaben-/Prozesslayout in meinem Dienst, YMMV in diesem Bereich).

Ich habe die Aktivität folgendermaßen definiert:

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();
    }
}

Und das letzte Puzzleteil, das transparente Thema (ich bin nicht sicher, aber Sie könnten wahrscheinlich das eingebaute Android durchscheinende Thema) verwenden) - 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>  
88
Wayne Uroda