Подтвердить что ты не робот

Диалоговое окно подтверждения разрешения хоста

Я хочу использовать android в индустрии,

Я могу подключиться к Profilic и Ftdi USB для последовательных чипов с библиотекой slickdevlabs.com без каких-либо проблем.

Приложение имеет сервис и запускается при загрузке, подключается к последовательному порту USB и выполняет другие действия.

моя проблема в том, что хост-устройство не имеет никакого взаимодействия с пользователем,

поэтому, когда андроид спрашивает

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

нет человека, который бы нажал на ok.

даже если я проверю использование по умолчанию.... Если я снова вставляю USB или перезагружаю хост-устройство, он снова запрашивает следующую загрузку.

Я запускал службу и приложение с режимом SuperUser, но без разницы, он снова спрашивает.

Я добавил фильтр намерений, но никакой разницы, он спрашивает меня каждый раз.

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

Любое мнение, как обходить или отключать его?

У меня есть доступ root и SU.

4b9b3361

Ответ 1

Я знаю это немного позже, но все же...

У меня была такая же проблема, и я думаю, что мне удалось ее решить. Там служба, которую использует Android, позволяет управлять устройствами USB и аксессуарами. Эта служба скрыта от сторонних разработчиков и не документирована. Если вы проверите исходный код для UsbPermissionActivity, вы сможете выяснить, как называется эта услуга. Для вызова службы используются интерфейс IUsbManager и класс ServiceManager. Они тоже скрыты, поэтому вы не можете использовать их напрямую. Но то, что вы можете сделать, это создайте свои заглушки с точно такими же именами и в соответствующих пространствах имен (пакетах). Тогда вы сможете скомпилировать этот код, в то время как среда выполнения будет использовать реальные вещи.

Единственное требование заключается в том, что ваше приложение должно быть системным - оно должно быть расположено в каталоге /system/app/. Поскольку ваше устройство внедрено, это не должно быть проблемой.

Итак, вам нужно добавить пакет в свой проект: " android.hardware.usb" и поместить в него файл с именем " IUsbManager.java" с помощью следующий контент:

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

Затем другой пакет: android.os "с" 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!" );
    }
}

Обратите внимание, что интерфейсы этих классов могут меняться в зависимости от версии Android. В моем случае версия 4.0.3. Поэтому, если у вас есть другая версия Android, и этот код не работает, вам нужно будет проверить исходный код для вашей конкретной версии ОС.

Здесь приведен пример использования службы для предоставления разрешений всем устройствам FTDI:

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

Еще одна вещь - вам придется добавить следующее разрешение на ваш манифест (Lint может не понравиться, но вы всегда можете изменить уровень серьезности в своих свойствах проекта):

<uses-permission android:name="android.permission.MANAGE_USB" />

Ответ 2

@d_d_t aswer отлично, но он не работает на Android> 4.2.2. Используйте этот интерфейс:

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

И измените код, добавив идентификатор пользователя:

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

Ответ 3

У меня была та же проблема с всплывающим окном, и никто не нажимал на него. Но я нашел другое решение (для рутованных устройств). Всплывающее окно генерируется Android в классе UsbPermissionActivity (и UsbSettingsManager запускается UsbPermissionActivity). Посмотрите на Android Sourcecode, чтобы увидеть, что происходит. Здесь хорошо, что мы можем манипулировать байт-кодом UsbPermissionActivity, чтобы принимать все UsbDevices. Вам нужен инструмент Smali/Baksmali для этого. https://code.google.com/p/smali/

  1. Найдите файл SystemUI.apk на своем устройстве
  2. Скопируйте его на свой компьютер с помощью adb pull path/to/SystemUI.apk
  3. Разархивируйте apk
  4. Разберите файл classes.dex с помощью java -jar baksmali.jar classes.dex
  5. Найдите файл UsbPermissionActivity и внутри него найдите строку с надписью

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

  6. Измените это, закомментировав и добавив две новые строки

#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. Соберите его с помощью java -jar smali.jar -o classes.dex out
  2. Замените исходный файл classes.dex и снова скопируйте все в SystemUI.apk
  3. Замените оригинальный файл SystemUI.apk на вашем устройстве на adb push services.jar path/to/SystemUI.apk или, если это не работает с файловым менеджером

Ответ 4

Если у вас есть возможность скомпилировать систему Android, то вы ничего не сможете сделать.

Вы можете добавить

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

    finish();
}

в рамки /base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java

чтобы обойти всплывающее окно подтверждения разрешения.

Ответ 5

Android действительно не предназначен для поддержки такого использования из коробки. Лично для неинтерактивного использования у меня возникнет соблазн рассмотреть возможность использования последовательного драйвера USB в ядре linux и пропустить авизу USB-устройства Android. Но вы должны быть в состоянии серьезно изменить установку Android - изменить конфигурацию ядра и/или загрузить модуль, создать файлы устройств и установить их разрешения или владельцев, возможно, добавить группу unix и андроид для приложений, разрешенных для доступ к ней.

Или вы можете просмотреть источник android и отключить подтверждение пользователя; но если у вас нет исходной сборки Android для устройства, это может быть сложнее, чем идея уровня Linux, поскольку адаптация open-source android для работы на устройстве-поставщике может быть нетривиальной (если кто-то уже не предлагает от -source build, которая достаточно функциональна для рассматриваемого устройства)

Изначально, доступ root/su не применяется к самим приложениям - это означает только то, что приложение, которое знает, как запускать любой инструмент, оставшийся после вашего корневого взлома, может запустить вспомогательную программу, которая выполняется с правами root, но само приложение не может и не может. Использование root для установки приложения в системном разделе может привести к некоторым атипичным разрешениям андроида, но вам нужно будет проверить, есть ли какие-либо средства, которые помогут вам с usb.

Ответ 6

Я думаю, что белый список аксессуаров, которые вы используете заранее, будет лучшим решением. Для этого вам нужно добавить файл usb_device_manager.xml в этом месте /Данные/система/пользователей /0
// Обратите внимание, что 0 - это идентификатор пользователя, вероятно, это будет 0, если вы не добавили больше пользователей в Android, но если вы изменили этот идентификатор соответствующим образом

Вот как должен выглядеть файл:

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

Для такой доски http://www.embeddedartists.com/products/app/aoa_kit.php это:

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

Ответ 7

В соответствии с документацией на Android Developers у вас уже есть разрешение на подключенное устройство USB, когда ваше приложение запускается через ваш фильтр намеренного намерения. Возможно, вам следует попробовать этот подход и написать фильтр, чтобы точно соответствовать устройству, которое вы хотите использовать, чтобы другие приложения не хотели связываться с устройством.

См. "Примечание" на http://developer.android.com/guide/topics/connectivity/usb/host.html#permission-d

Ответ 8

Один из способов добиться этого, обратите внимание, что на самом деле это не избавит нас от подтверждения, было бы определить местоположение checkbox и использовать эквивалент Android Robot, чтобы выбрать его, а затем выберите OK. Вы можете написать приложение, которое работает в фоновом режиме, его даже можно вызвать с помощью той службы запуска, о которой вы упомянули, специально для этой цели.

Ответ 9

Если вы просто хотите скопировать/записать на USB-накопитель, вы можете использовать

следующий метод с командами linx doCommand ( "mkdir/mnt/usbhost1/dirname" )

private boolean doCommand(String[] commands)
{

    boolean ran = false;
    try
    {

        Process process = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());
        for (String single : commands) {
            os.writeBytes(single + "\n");
            os.flush();
        }
        os.writeBytes("exit\n");
        os.flush();
        process.waitFor();
        ran = true;
    }
    catch(Exception ex)
    {

    }
    return ran;
}

У меня есть следующие разрешения в моем манифесте, чтобы сожалеть, не помните, какие из них являются обязательными.

<permission android:name="com.android.example.USB_PERMISSION"/>
<permission android:name= "android.permission.INSTALL_PACKAGES"/>
<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<data android:scheme="file" />

Если вы хотите сделать что-нибудь еще, это может быть не очень полезно для вас извините

Ответ 10

Если у вас есть доступ к исходному коду Android, вот код, необходимый для отключения диалогового окна разрешений.

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

Приведенное выше обновление кода создает параметр конфигурации, который вы можете использовать, или вместо этого вы можете жестко закодировать его, используя значение true вместо mDisablePermissionDialogs чтобы отключить диалог разрешений.

В services/usb/java/com/android/server/usb/UsbSettingsManager.java

Ответ 11

В первый раз, когда он нуждается в подтверждении, вы можете выбрать "всегда", а затем, даже если устройство Android выключено и включено, ваше приложение все еще имеет разрешение на доступ к USB2Serial. Просто сказать, только один раз подтвердите!

Ответ 12

У меня была та же проблема, всплывающее окно с разрешением появляется каждый раз, когда я подключаю USB-кабель, чтобы решить его, я просто добавил фильтр в манифест и XML файл для VID и PID, просто убедитесь, что вы настроили фильтрацию USB-устройства, как предложено в ссылка SO выше или как задокументировано здесь, и вы положили хорошие VID и PID. Это была моя проблема, я не поставил VID и PID, которые соответствуют моему устройству

Ответ 13

Я думаю, мы можем сделать это, внеся некоторые изменения в /etc/udev. Мы могли бы добавить идентификатор поставщика и идентификатор устройства в файл 51-android.rules.