Intereting Posts
Android-Webview onPageFinished Called Twice Как создать Raw-сокет в Android? Ошибка: выполнение выполнено для задачи ': ProjectName: mergeDebugResources'. > Crunching Cruncher * некоторые файлы * сбой, см. Журналы Графический тест для Android: один класс Стандарт архитектуры Android MVP для загрузки пользовательского интерфейса с классом модели, имеющим ресурс android Android: вызов super () в начале или конце onStart (), onStop (), onDestroy () в активности? В чем разница между onCreateOptionsMenu (меню меню) и onPrepareOptionsMenu (меню меню)? Поддержка RTL: отключение его только для определенных компонентов пользовательского интерфейса Проблемы с реализацией режима контекстного действия в фрагменте recyclerview Как реализовать кнопку на Android-виджете Android 3.1 USB-хост – BroadcastReceiver не получает USB_DEVICE_ATTACHED Android VideoView MediaPlayer OnInfoListener – события не запускаются Когда у Android будет открытый API календаря? Меню с панелью действий Как получить URI моей базы данных SQLite в приложении для Android?

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

Я хочу использовать 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.

Даже когда я проверяю использование по умолчанию … checkbox. Если я снова вставляю 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 доступ.

Solutions Collecting From Web of "Диалоговое окно подтверждения разрешения хоста"

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

У меня была такая же проблема, и я думаю, что мне удалось ее решить. Существует служба, которую использует 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" /> 

@d_d_t aswer отлично, но он не работает над новым 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 ); .... 

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

Можете добавить

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

К frameworks / base / packages / SystemUI / src / com / android / systemui / usb / UsbPermissionActivity.java

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

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

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

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

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

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

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

  1. Найдите файл SystemUI.apk на своем устройстве
  2. Скопируйте его на компьютер с помощью adb pull path/to/SystemUI.apk
  3. Распаковать apk
  4. Разберите файл java -jar baksmali.jar 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. Замените исходные классы.dex и снова запишите все в SystemUI.apk
  3. Замените исходный SystemUI.apk на вашем устройстве с помощью adb push services.jar path/to/SystemUI.apk или если это не работает с файловым менеджером ap

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

Я думаю, что белым списком аксессуара, который вы используете заранее, будет лучшее решение. Для этого вам нужно добавить файл usb_device_manager.xml в этом месте / data / system / users / 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> 

Если вы просто хотите копировать / писать на 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" /> 

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

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

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