обход Android usb host диалоговое окно подтверждения разрешения
Я хочу использовать Android в промышленности,
Я могу подключиться к Profilic и FTDI USB к последовательным чипам с slickdevlabs.com библиотека без каких-либо проблем.
приложение имеет службу, и она запускается при загрузке, подключается к последовательному порту usb и делает другие вещи.
моя проблема в том, что хост-устройство не имеет никакого взаимодействия с пользователем,
поэтому, когда android спрашивает
Allow the app "MyAPP" to access the USB device ?
[checkmark]Use by default for this USB device
Cancel OK
нет человека, чтобы нажать на ладно.
даже когда я проверяю использование по умолчанию... флажок, если я снова вставляю USB или перезагружаю хост-устройство, он снова запрашивает при следующей загрузке.
Я запустил службу и приложение с режимом суперпользователя,но без разницы, он снова спрашивает.
я добавил фильтр намерений, но никакой разницы, он спрашивает меня каждый раз.
<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.
12 ответов
Я знаю, что немного поздно, но все же...
у меня была такая же проблема, и я думаю, мне удалось решить. Существует служба, которую Android использует внутри, что позволяет управлять USB-устройствами и аксессуарами. Эта услуга скрыта от разработчиков thrid party и не документирована. Если вы проверите исходный код UsbPermissionActivity, вы сможете выяснить, как вызывается эта служба. Для вызова интерфейса iusbmanager службы и класса ServiceManager частный предприниматель. Они оба скрыты, поэтому вы не можете использовать их напрямую. Но что вы можете сделать, это создавать свои заглушки с точно такими же именами и в соответствующих пространствах имен (пакеты). Тогда вы сможете скомпилировать этот код, в то время как среда выполнения будет использовать реальные вещи.
только требование это ваше приложение должно быть системным - то есть он должен быть расположен в каталоге/system/ app/. Поскольку ваше устройство укоренено, что не должно быть проблемой.
таким образом, вам придется добавить пакет в свой проект: "android.аппаратура.для 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;
}
и измените код, добавив ID пользователя:
...
service.setDevicePackage( usbDevice, YOUR_APP_PACKAGE_NAMESPACE, ai.uid );
....
Если у вас есть возможность скомпилировать систему android, то нет ничего, что вы не можете сделать.
вы можете добавить
public void onStart() {
super.onStart();
mPermissionGranted = true;
finish();
}
основ/основа/пакеты/SystemUI не/РКЦ/кОм/для Android/SystemUI не/и USB/UsbPermissionActivity.java
чтобы обойти всплывающее окно подтверждения разрешения.
у меня была такая же проблема с всплывающим окном и никто не щелкните по нему. Но я нашел другое решение (для корневых устройств). Всплывающее окно генерируется android в классе UsbPermissionActivity (и что UsbPermissionActivity запускается UsbSettingsManager). Посмотрите на исходный код Android, чтобы увидеть, что происходит. Хорошая вещь здесь, мы можем манипулировать байт-кодом UsbPermissionActivity, чтобы принять все UsbDevices. Вам нужен инструмент Smali/Baksmali сделать это. https://code.google.com/p/smali/
- найдите файл SystemUI не.apk на вашем устройстве!--18-->
- скопируйте его на свой компьютер с помощью
adb pull path/to/SystemUI.apk
- распаковать apk
- разбирать классов.файл dex с
java -jar baksmali.jar classes.dex
-
найдите файл UsbPermissionActivity и внутри него найдите строку, которая говорит
invoke-virtual {p0}, Lcom/android/systemui/usb/UsbPermissionActivity;->setupAlert()V
измените это, комментируя его и добавляя две новые строки
#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
- собрать его с
java -jar smali.jar -o classes.dex out
- заменить исходные классы.Декс и zip все снова в SystemUI.apk
- замените оригинальный SystemUI.APK на вашем устройстве с
adb push services.jar path/to/SystemUI.apk
или если это не работает с AP
Android действительно не предназначена для такого использования из коробки. Лично для неинтерактивного использования я бы соблазнился рассмотреть возможность использования USB-последовательного драйвера в ядре linux и пропуска Android USB apis. Но вы должны быть в состоянии серьезно изменить установку android-изменить конфигурацию ядра и / или загрузить модуль, создать файлы устройств и установить их разрешения или владельцев, возможно, добавить группу unix и разрешение android для разрешенных приложений обращаться к нему.
или вы можете просмотреть источник android и отключить подтверждение пользователя; но если у вас нет сборки android из источника для устройства, это может быть сложнее, чем идея уровня linux, поскольку адаптация android с открытым исходным кодом для запуска на устройстве поставщика может быть нетривиальной (если кто-то уже не предлагает сборку из источника, которая достаточно функциональна для рассматриваемого устройства)
Indicentally, корень/Су Access не применяется к приложениям сами-это только означает, что приложение, которое знает, как запустить любой инструмент, который ваш root hack оставил позади, может запустить вспомогательную программу, которая работает как root, но само приложение не делает и не может. Использование root для установки приложения на системный раздел может дать вам некоторые нетипичные разрешения android, но вам нужно будет проверить, есть ли какие-либо, которые помогут вам с usb.
согласно документации по разработчикам Android у вас уже есть разрешение на подключенное USB-устройство, когда ваше приложение запускается через фильтр манифеста намерения. Возможно, вы должны попробовать этот подход и написать фильтр, чтобы точно соответствовать устройству, которое вы хотите использовать, чтобы предотвратить, что другие приложения также хотят общаться с устройством.
см. "Примечание" На http://developer.android.com/guide/topics/connectivity/usb/host.html#permission-d
один из способов достичь этого, обратите внимание, что это на самом деле не избавляется от подтверждения, было бы определить местоположение checkbox
и использовать Android-эквивалент робот класс, чтобы выбрать его, а затем выберите OK
. Вы можете написать приложение, которое работает в фоновом режиме, его можно даже вызвать той службой запуска, о которой Вы упомянули, специально для этой цели.
Я думаю, что белый список аксессуаров, которые вы используете заранее, будет лучшим решением.
Для этого нужно добавить файл
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>
Я думаю, что мы можем сделать, это внести некоторые изменения в /etc/udev
. Мы могли бы добавить идентификатор поставщика и идентификатор устройства в .
в первый раз, когда это необходимо Подтвердить, вы можете выбрать "всегда", то даже если Android устройство выключено, и питание, ваше приложение по-прежнему имеет разрешение на доступ к USB2Serial. Просто сказать, только один раз подтвердите!
У меня была та же проблема, всплывающее окно разрешения появляется каждый раз, когда я подключаю USB-кабель, чтобы решить ее, я просто добавил фильтр в манифест и xml-файл для VID и PID, просто убедитесь, что вы настроили фильтрацию USB-устройства, как предложено в ссылке SO выше или как описано здесь, и вы положили хороший VID и PID. Это была моя проблема, я не поставил VID и PID, которые соответствуют моему устройству
Если вы просто хотите скопировать / записать на 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" />
Если вы хотите сделать что-нибудь еще, это может быть не очень полезно для вас извините