it-swarm.com.de

android-USB-Host-Berechtigungsbestätigungsdialogfeld umgehen

Ich möchte Android in der Industrie nutzen,

Ich kann problemlos mit der slickdevlabs.com-Bibliothek eine Verbindung zu Profilic und Ftdi USB zu seriellen Chips herstellen.

Die Anwendung verfügt über einen Dienst und startet beim Booten, stellt eine Verbindung zum seriellen USB-Port her und erledigt die anderen Aufgaben.

mein Problem ist, dass das Host-Gerät keine Interaktion mit dem Benutzer hat.

also wenn das Android fragt 

Allow the app "MyAPP" to access the USB device ?
[checkmark]Use by default for this USB device
Cancel            OK

es gibt keine Person, die auf OK klickt.

selbst wenn ich die Verwendung standardmäßig markiere ... Kontrollkästchen: Wenn ich den USB-Anschluss wieder einsetze oder das Host-Gerät neu starte, werden Sie beim nächsten Start erneut gefragt.

Ich habe den Dienst und die App mit dem SuperUser-Modus ausgeführt, aber es besteht kein Unterschied.

Ich habe einen Intent-Filter hinzugefügt, aber keinen Unterschied, es fragt mich jedes Mal.

        <intent-filter>
            <action Android:name="Android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action Android:name="Android.hardware.usb.action.USB_DEVICE_DETACHED" />
        </intent-filter>

        <meta-data
            Android:name="Android.hardware.usb.action.USB_DEVICE_ATTACHED"
            Android:resource="@xml/device_filter" />
        <meta-data
            Android:name="Android.hardware.usb.action.USB_DEVICE_DETACHED"
            Android:resource="@xml/device_filter" />

Jede Meinung, wie man sie umgehen oder deaktivieren kann?

Ich habe root- und SU-Zugriff.

25
AliRezza

Ich weiß, es ist ein bisschen spät, aber trotzdem ...

Ich hatte das gleiche Problem und glaube, ich habe es geschafft, es zu lösen. Es gibt einen Dienst, den Android intern verwendet, um USB-Geräte und Zubehör zu verwalten. Dieser Dienst ist für Entwickler von Drittanbietern verborgen und nicht dokumentiert. Wenn Sie den Quellcode für UsbPermissionActivity überprüfen, können Sie herausfinden, wie der Dienst aufgerufen wird. Um die IUsbManager-Schnittstelle und die ServiceManager-Klasse aufzurufen, werden sie verwendet. Beide sind ebenfalls versteckt, sodass Sie sie nicht direkt verwenden können. Sie können jedoch Ihre Stubs mit genau denselben Namen und in entsprechenden Namespaces (Paketen) erstellen. Dann können Sie diesen Code kompilieren, während die Laufzeitumgebung die echten Dinge verwendet.

Die einzige Anforderung von request ist, dass Ihre Anwendung eine Systemanwendung sein muss, dh sie muss sich im Verzeichnis/system/app/befinden. Da Ihr Gerät verwurzelt ist, sollte dies kein Problem sein.

Sie müssen also Ihrem Projekt ein Paket hinzufügen: "Android.hardware.usb" und eine Datei mit dem Namen "IUsbManager.Java" mit folgendem Inhalt einfügen:

package Android.hardware.usb;

public interface IUsbManager extends Android.os.IInterface
{
    /** Local-side IPC implementation stub class. */
    public static abstract class Stub extends Android.os.Binder implements Android.hardware.usb.IUsbManager
    {
        /** Construct the stub at attach it to the interface. */
        public Stub()
        {
            throw new RuntimeException( "Stub!" );
        }
        /**
         * Cast an IBinder object into an Android.hardware.usb.IUsbManager interface,
         * generating a proxy if needed.
         */
        public static Android.hardware.usb.IUsbManager asInterface( Android.os.IBinder obj )
        {
            throw new RuntimeException( "Stub!" );
        }

        public Android.os.IBinder asBinder()
        {
            throw new RuntimeException( "Stub!" );
        }

        public boolean onTransact( int code, Android.os.Parcel data, Android.os.Parcel reply, int flags ) throws Android.os.RemoteException
        {
            throw new RuntimeException( "Stub!" );
        }

        static final int TRANSACTION_getDeviceList = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
        static final int TRANSACTION_openDevice = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
        static final int TRANSACTION_getCurrentAccessory = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
        static final int TRANSACTION_openAccessory = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
        static final int TRANSACTION_setDevicePackage = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
        static final int TRANSACTION_setAccessoryPackage = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 5);
        static final int TRANSACTION_hasDevicePermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 6);
        static final int TRANSACTION_hasAccessoryPermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 7);
        static final int TRANSACTION_requestDevicePermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 8);
        static final int TRANSACTION_requestAccessoryPermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 9);
        static final int TRANSACTION_grantDevicePermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 10);
        static final int TRANSACTION_grantAccessoryPermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 11);
        static final int TRANSACTION_hasDefaults = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 12);
        static final int TRANSACTION_clearDefaults = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 13);
        static final int TRANSACTION_setCurrentFunction = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 14);
        static final int TRANSACTION_setMassStorageBackingFile = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 15);
    }

    /* Returns a list of all currently attached USB devices */
    public void getDeviceList( Android.os.Bundle devices ) throws Android.os.RemoteException;
    /* Returns a file descriptor for communicating with the USB device.
         * The native fd can be passed to usb_device_new() in libusbhost.
         */
    public Android.os.ParcelFileDescriptor openDevice( Java.lang.String deviceName ) throws Android.os.RemoteException;
    /* Returns the currently attached USB accessory */
    public Android.hardware.usb.UsbAccessory getCurrentAccessory() throws Android.os.RemoteException;
    /* Returns a file descriptor for communicating with the USB accessory.
         * This file descriptor can be used with standard Java file operations.
         */
    public Android.os.ParcelFileDescriptor openAccessory( Android.hardware.usb.UsbAccessory accessory ) throws Android.os.RemoteException;
    /* Sets the default package for a USB device
         * (or clears it if the package name is null)
         */
    public void setDevicePackage( Android.hardware.usb.UsbDevice device, Java.lang.String packageName ) throws Android.os.RemoteException;
    /* Sets the default package for a USB accessory
         * (or clears it if the package name is null)
         */
    public void setAccessoryPackage( Android.hardware.usb.UsbAccessory accessory, Java.lang.String packageName ) throws Android.os.RemoteException;
    /* Returns true if the caller has permission to access the device. */
    public boolean hasDevicePermission(Android.hardware.usb.UsbDevice device) throws Android.os.RemoteException;
    /* Returns true if the caller has permission to access the accessory. */
    public boolean hasAccessoryPermission( Android.hardware.usb.UsbAccessory accessory ) throws Android.os.RemoteException;
    /* Requests permission for the given package to access the device.
         * Will display a system dialog to query the user if permission
         * had not already been given.
         */
    public void requestDevicePermission( Android.hardware.usb.UsbDevice device, Java.lang.String packageName, Android.app.PendingIntent pi ) throws Android.os.RemoteException;
    /* Requests permission for the given package to access the accessory.
         * Will display a system dialog to query the user if permission
         * had not already been given. Result is returned via pi.
         */
    public void requestAccessoryPermission( Android.hardware.usb.UsbAccessory accessory, Java.lang.String packageName, Android.app.PendingIntent pi ) throws Android.os.RemoteException;
    /* Grants permission for the given UID to access the device */
    public void grantDevicePermission( Android.hardware.usb.UsbDevice device, int uid ) throws Android.os.RemoteException;
    /* Grants permission for the given UID to access the accessory */
    public void grantAccessoryPermission( Android.hardware.usb.UsbAccessory accessory, int uid ) throws Android.os.RemoteException;
    /* Returns true if the USB manager has default preferences or permissions for the package */
    public boolean hasDefaults( Java.lang.String packageName ) throws Android.os.RemoteException;
    /* Clears default preferences and permissions for the package */
    public void clearDefaults( Java.lang.String packageName ) throws Android.os.RemoteException;
    /* Sets the current USB function. */
    public void setCurrentFunction( Java.lang.String function, boolean makeDefault ) throws Android.os.RemoteException;
    /* Sets the file path for USB mass storage backing file. */
    public void setMassStorageBackingFile( Java.lang.String path ) throws Android.os.RemoteException;
}

Dann noch ein Paket: "Android.os" mit "ServiceManager.Java":

package Android.os;

import Java.util.Map;

public final class ServiceManager
{
    public static IBinder getService( String name )
    {
        throw new RuntimeException( "Stub!" );
    }

    /**
     * Place a new @a service called @a name into the service
     * manager.
     * 
     * @param name the name of the new service
     * @param service the service object
     */
    public static void addService( String name, IBinder service )
    {
        throw new RuntimeException( "Stub!" );
    }

    /**
     * Retrieve an existing service called @a name from the
     * service manager.  Non-blocking.
     */
    public static IBinder checkService( String name )
    {
        throw new RuntimeException( "Stub!" );
    }

    public static String[] listServices() throws RemoteException
    {
        throw new RuntimeException( "Stub!" );
    }

    /**
     * This is only intended to be called when the process is first being brought
     * up and bound by the activity manager. There is only one thread in the process
     * at that time, so no locking is done.
     * 
     * @param cache the cache of service references
     * @hide
     */
    public static void initServiceCache( Map<String, IBinder> cache )
    {
        throw new RuntimeException( "Stub!" );
    }
}

Beachten Sie, dass sich die Schnittstellen dieser Klassen je nach Android-Version ändern können. In meinem Fall ist die Version 4.0.3 . Wenn Sie also eine andere Android-Version haben und dieser Code nicht funktioniert, müssen Sie den Quellcode für Ihre bestimmte Betriebssystemversion überprüfen.

Hier ein Beispiel für die Verwendung des Dienstes zum Erteilen von Berechtigungen für alle FTDI-Geräte:

import Java.util.HashMap;
import Java.util.Iterator;

import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.content.pm.ApplicationInfo;
import Android.content.pm.PackageManager;
import Android.hardware.usb.IUsbManager;
import Android.hardware.usb.UsbDevice;
import Android.hardware.usb.UsbManager;
import Android.os.IBinder;
import Android.os.ServiceManager;

public class LaunchReceiver extends BroadcastReceiver
{
    public void onReceive( Context context, Intent intent )
    {
        String action = intent.getAction();
        if( action != null && action.equals( Intent.ACTION_BOOT_COMPLETED ) )
        {
            try
            {
                PackageManager pm = context.getPackageManager();
                ApplicationInfo ai = pm.getApplicationInfo( YOUR_APP_PACKAGE_NAMESPACE, 0 );
                if( ai != null )
                {
                    UsbManager manager = (UsbManager) context.getSystemService( Context.USB_SERVICE );
                    IBinder b = ServiceManager.getService( Context.USB_SERVICE );
                    IUsbManager service = IUsbManager.Stub.asInterface( b );

                    HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
                    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
                    while( deviceIterator.hasNext() )
                    {
                            UsbDevice device = deviceIterator.next();
                            if( device.getVendorId() == 0x0403 )
                            {
                                service.grantDevicePermission( device, ai.uid );
                                service.setDevicePackage( device, YOUR_APP_PACKAGE_NAMESPACE );
                            }
                    }
                }
            }
            catch( Exception e )
            {
                trace( e.toString() );
            }
        }
    }
}

Eine weitere Sache - Sie müssen Ihrem Manifest die folgende Berechtigung hinzufügen (Lint mag es vielleicht nicht, aber Sie können den Schweregrad der Eigenschaften Ihres Projekts jederzeit ändern): 

<uses-permission Android:name="Android.permission.MANAGE_USB" />
24
d_d_t

Die Antwort von @d_d_t ist großartig, funktioniert aber nicht mit dem neuen 4.2.2. Verwenden Sie diese Schnittstelle:

public interface IUsbManager extends Android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends Android.os.Binder implements Android.hardware.usb.IUsbManager {
    private static final Java.lang.String DESCRIPTOR = "Android.hardware.usb.IUsbManager";

    /** Construct the stub at attach it to the interface. */
    public Stub()         {
        throw new RuntimeException( "Stub!" );
    }

    /**
     * Cast an IBinder object into an Android.hardware.usb.IUsbManager
     * interface, generating a proxy if needed.
     */
    public static Android.hardware.usb.IUsbManager asInterface( Android.os.IBinder obj) {
        throw new RuntimeException( "Stub!" );
    }

    @Override
    public Android.os.IBinder asBinder() {
        throw new RuntimeException( "Stub!" );
    }

    @Override
    public boolean onTransact(int code, Android.os.Parcel data, Android.os.Parcel reply, int flags) throws Android.os.RemoteException {
        throw new RuntimeException( "Stub!" );
    }

    static final int TRANSACTION_getDeviceList = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    static final int TRANSACTION_openDevice = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
    static final int TRANSACTION_getCurrentAccessory = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
    static final int TRANSACTION_openAccessory = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
    static final int TRANSACTION_setDevicePackage = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
    static final int TRANSACTION_setAccessoryPackage = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 5);
    static final int TRANSACTION_hasDevicePermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 6);
    static final int TRANSACTION_hasAccessoryPermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 7);
    static final int TRANSACTION_requestDevicePermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 8);
    static final int TRANSACTION_requestAccessoryPermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 9);
    static final int TRANSACTION_grantDevicePermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 10);
    static final int TRANSACTION_grantAccessoryPermission = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 11);
    static final int TRANSACTION_hasDefaults = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 12);
    static final int TRANSACTION_clearDefaults = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 13);
    static final int TRANSACTION_setCurrentFunction = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 14);
    static final int TRANSACTION_setMassStorageBackingFile = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 15);
    static final int TRANSACTION_allowUsbDebugging = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 16);
    static final int TRANSACTION_denyUsbDebugging = (Android.os.IBinder.FIRST_CALL_TRANSACTION + 17);
}

/* Returns a list of all currently attached USB devices */
public void getDeviceList(Android.os.Bundle devices)
        throws Android.os.RemoteException;

/*
 * Returns a file descriptor for communicating with the USB device. The
 * native fd can be passed to usb_device_new() in libusbhost.
 */
public Android.os.ParcelFileDescriptor openDevice(
        Java.lang.String deviceName) throws Android.os.RemoteException;

/* Returns the currently attached USB accessory */
public Android.hardware.usb.UsbAccessory getCurrentAccessory()
        throws Android.os.RemoteException;

/*
 * Returns a file descriptor for communicating with the USB accessory. This
 * file descriptor can be used with standard Java file operations.
 */
public Android.os.ParcelFileDescriptor openAccessory(
        Android.hardware.usb.UsbAccessory accessory)
        throws Android.os.RemoteException;

/*
 * Sets the default package for a USB device (or clears it if the package
 * name is null)
 */
public void setDevicePackage(Android.hardware.usb.UsbDevice device,
        Java.lang.String packageName, int userId)
        throws Android.os.RemoteException;

/*
 * Sets the default package for a USB accessory (or clears it if the package
 * name is null)
 */
public void setAccessoryPackage(
        Android.hardware.usb.UsbAccessory accessory,
        Java.lang.String packageName, int userId)
        throws Android.os.RemoteException;

/* Returns true if the caller has permission to access the device. */
public boolean hasDevicePermission(Android.hardware.usb.UsbDevice device)
        throws Android.os.RemoteException;

/* Returns true if the caller has permission to access the accessory. */
public boolean hasAccessoryPermission(
        Android.hardware.usb.UsbAccessory accessory)
        throws Android.os.RemoteException;

/*
 * Requests permission for the given package to access the device. Will
 * display a system dialog to query the user if permission had not already
 * been given.
 */
public void requestDevicePermission(Android.hardware.usb.UsbDevice device,
        Java.lang.String packageName, Android.app.PendingIntent pi)
        throws Android.os.RemoteException;

/*
 * Requests permission for the given package to access the accessory. Will
 * display a system dialog to query the user if permission had not already
 * been given. Result is returned via pi.
 */
public void requestAccessoryPermission(
        Android.hardware.usb.UsbAccessory accessory,
        Java.lang.String packageName, Android.app.PendingIntent pi)
        throws Android.os.RemoteException;

/* Grants permission for the given UID to access the device */
public void grantDevicePermission(Android.hardware.usb.UsbDevice device,
        int uid) throws Android.os.RemoteException;

/* Grants permission for the given UID to access the accessory */
public void grantAccessoryPermission(
        Android.hardware.usb.UsbAccessory accessory, int uid)
        throws Android.os.RemoteException;

/*
 * Returns true if the USB manager has default preferences or permissions
 * for the package
 */
public boolean hasDefaults(Java.lang.String packageName, int userId)
        throws Android.os.RemoteException;

/* Clears default preferences and permissions for the package */
public void clearDefaults(Java.lang.String packageName, int userId)
        throws Android.os.RemoteException;

/* Sets the current USB function. */
public void setCurrentFunction(Java.lang.String function,
        boolean makeDefault) throws Android.os.RemoteException;

/* Sets the file path for USB mass storage backing file. */
public void setMassStorageBackingFile(Java.lang.String path)
        throws Android.os.RemoteException;

/*
 * Allow USB debugging from the attached Host. If alwaysAllow is true, add
 * the the public key to list of Host keys that the user has approved.
 */
public void allowUsbDebugging(boolean alwaysAllow,
        Java.lang.String publicKey) throws Android.os.RemoteException;

/* Deny USB debugging from the attached Host */
public void denyUsbDebugging() throws Android.os.RemoteException;
}

Und ändern Sie den Code, der die Benutzer-ID hinzufügt:

...
service.setDevicePackage( usbDevice, YOUR_APP_PACKAGE_NAMESPACE, ai.uid ); 
....
10
Alvins

ich hatte das gleiche Problem mit dem Popup-Fenster und niemand darauf zu klicken. Aber ich habe eine andere Lösung gefunden (für gerootete Geräte). Das Popup wird von Android in der Klasse UsbPermissionActivity generiert (und UsbPermissionActivity wird vom UsbSettingsManager gestartet) der Android Quellcode, um zu sehen, was los ist. Das Gute hier ist, dass wir den Bytecode der UsbPermissionActivity manipulieren können, um alle UsbDevices zu akzeptieren. Sie benötigen das Tool Smali/Baksmali , um dies zu tun. https://code.google.com/p/smali/

  1. Suchen Sie die Datei SystemUI.apk auf Ihrem Gerät
  2. Kopieren Sie es mit adb pull path/to/SystemUI.apk Auf Ihren Computer.
  3. Entpacken Sie die apk
  4. Zerlegen Sie die classes.dex-Datei mit Java -jar baksmali.jar classes.dex
  5. Suchen Sie die Datei UsbPermissionActivity und darin die Zeile mit der Aufschrift

    invoke-virtual {p0}, Lcom/Android/systemui/usb/UsbPermissionActivity;->setupAlert()V

  6. Ändern Sie dies, indem Sie es auskommentieren und zwei neue Zeilen hinzufügen

#invoke-virtual {p0}, Lcom/Android/systemui/usb/UsbPermissionActivity;->setupAlert()V const/4 v0, 0x1 iput-boolean v0, p0, Lcom/Android/systemui/usb/UsbPermissionActivity;->mPermissionGranted:Z invoke-virtual {p0}, Lcom/Android/systemui/usb/UsbPermissionActivity;->finish()V

  1. Setze es mit Java -jar smali.jar -o classes.dex out Zusammen
  2. Ersetzen Sie das ursprüngliche classes.dex und packen Sie alles erneut in SystemUI.apk
  3. Ersetzen Sie die ursprüngliche SystemUI.apk auf Ihrem Gerät durch adb Push services.jar path/to/SystemUI.apk Oder wenn dies mit einem Dateimanager-AP nicht funktioniert
7
user2574572

Wenn Sie die Möglichkeit haben, das Android-System zu kompilieren, können Sie nichts tun.

Du kannst hinzufügen 

public void onStart() {
    super.onStart();
    mPermissionGranted = true;

    finish();
}

zu Frameworks/Basis/Pakete/SystemUI/src/de/Android/systemui/usb/UsbPermissionActivity.Java 

um das Popup der Berechtigungsbestätigung zu umgehen.

5
Lewisou

Android unterstützt diese Art der Verwendung nicht. Persönlich wäre ich für die nicht interaktive Verwendung in der Versuchung, die Verwendung des seriellen USB-Treibers im Linux-Kernel in Betracht zu ziehen und die Android-USB-API zu überspringen. Sie müssen jedoch in der Lage sein, die Android-Installation ernsthaft zu ändern - ändern Sie die Kernelkonfiguration und/oder laden Sie ein Modul, erstellen Sie Gerätedateien und legen Sie deren Berechtigungen oder Besitzer fest. Fügen Sie möglicherweise eine Unix-Gruppe und eine Android-Berechtigung für Apps hinzu, die dazu berechtigt sind darauf zuzugreifen.

Oder Sie können die Android-Quelle durchsehen und die Benutzerbestätigung deaktivieren. Wenn Sie jedoch kein Android-Quellprodukt von Android für das Gerät haben, ist dies möglicherweise schwieriger als die Idee auf Linux-Ebene, da das Anpassen von Open Source-Android an ein Herstellergerät nicht trivial sein kann (es sei denn, jemand bietet bereits ein Betriebssystem an.) -source build, das für das betreffende Gerät ausreichend funktionsfähig ist)

Grundsätzlich gilt, dass root/su-Zugriff nicht für Anwendungen selbst gilt - dies bedeutet lediglich, dass eine Anwendung, die weiß, wie sie das von Ihrem Root-Hack hinterlassene Werkzeug ausführen soll, ein Hilfsprogramm starten kann, das als root ausgeführt wird, die Anwendung selbst jedoch nicht kann nicht. Wenn Sie die App mit root auf der Systempartition installieren, erhalten Sie möglicherweise einige untypische Android-Berechtigungen. Sie müssen jedoch prüfen, ob es irgendwelche gibt, die Ihnen beim Usb helfen könnten.

4
Chris Stratton

Laut der Dokumentation zu Android Developers haben Sie bereits die Berechtigung für das angeschlossene USB-Gerät, wenn Ihre App durch den Manifest-Absichtsfilter gestartet wird. Vielleicht sollten Sie diesen Ansatz ausprobieren und einen Filter schreiben, der genau auf das Gerät abgestimmt ist, das Sie verwenden möchten, um zu verhindern, dass andere Apps auch mit dem Gerät kommunizieren möchten.

Siehe den "Hinweis" auf http://developer.Android.com/guide/topics/connectivity/usb/Host.html#permission-d

2
PieterAelse

Ich denke, dass White-Listing das Zubehör, das Sie im Voraus verwenden, die beste Lösung sein wird. Um dies zu tun, müssen Sie die Datei hinzufügen. Benutzer/0
// Beachten Sie, dass 0 eine Benutzer-ID ist. Wahrscheinlich werden Sie 0 sein, wenn Sie keine weiteren Benutzer in Android hinzugefügt haben. Diese ID wurde jedoch entsprechend geändert

So sollte die Datei aussehen:

<settings>
<preference package="<PACKAGE NAME OF APP YOU WANT TO START ON CONNECTIONCTION>">
    <usb-accessory manufacturer="<NAME OF MANUFECTURER LIKE ONE REGISTERED IN meta-data in the manifest>" model="<MODEL NAME LIKE ONE REGISTERED IN meta-data in the manifest>" version="<VERSION LIKE ONE REGISTERED IN meta-data in the manifest>" />
</preference>

Für ein solches Board http://www.embeddedartists.com/products/app/aoa_kit.php ist es:

 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<settings>
<preference package="com.embeddedartists.aoa">
    <usb-accessory manufacturer="Embedded Artists AB" model="AOA Board - Basic" version="1.0" />
</preference>

2
PSIXO

Eine Möglichkeit, dies zu erreichen, beachten Sie, dass dadurch die Bestätigung nicht wirklich los wird. Bestimmen Sie den Ort der checkbox und verwenden Sie die Android-Entsprechung der Klasse Robot, um sie auszuwählen und dann auszuwählen OK. Sie könnten eine Anwendung schreiben, die im Hintergrund ausgeführt wird. Sie kann sogar von dem von Ihnen erwähnten Startdienst speziell für diesen Zweck aufgerufen werden.

2
cnexus

Wenn es zum ersten Mal bestätigt werden muss, können Sie "immer" auswählen. Selbst wenn das Android-Gerät heruntergefahren und eingeschaltet ist, verfügt Ihre App über die Berechtigung zum Zugriff auf das USB2Serial. Einfach nur einmal zu bestätigen!

0
cantonics

Ich hatte das gleiche Problem, das Popup-Fenster für die Berechtigung erscheint jedes Mal, wenn ich das USB-Kabel stecke. Um das Problem zu lösen, habe ich nur den Filter im Manifest und die XML-Datei für VID und PID hinzugefügt der SO - Link oben oder wie hier dokumentiert, und Sie geben die gute VID und PID ein. Es war mein Problem, ich habe nicht die passende VID und PID auf mein Gerät gestellt 

0
lotfi Raghib

Ich denke, wir können dies tun, indem wir einige Änderungen in /etc/udev vornehmen. Wir könnten die Hersteller-ID und die Geräte-ID in die 51-Android.rules-Datei einfügen.

0
user1979609

Wenn Sie Zugriff auf den Android Quellcode haben, ist hier der Code, den Sie zum Deaktivieren des Berechtigungsdialogs benötigen

https://gitlab.tubit.tu-berlin.de/justus.beyer/streamagame_platform_frameworks_base/commit/e97b62ed0d4050acacbf54781435686ea28edd7

Die obige Code-Aktualisierung erstellt eine Konfigurationsoption, die Sie verwenden können, oder Sie können sie mit dem Wert true anstelle von mDisablePermissionDialogs fest codieren, um das Berechtigungsdialogfeld zu deaktivieren.

Im services/usb/Java/com/Android/server/usb/UsbSettingsManager.Java

0
Ascari Gh