Код: Выделить всё
public class MainActivity extends AppCompatActivity {
public static final String ACTION_USB_PERMISSION = "com.example.usbtestapp.USB_PERMISSION";
static final int intentFlags = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) ? PendingIntent.FLAG_IMMUTABLE : 0;
static final int MY_CAMERA_PERMISSION_CODE = 100;
private Context ContextofMainAcitivity;
public IntentFilter USBconnectdisconnect_intentFilter;
public Intent GetEXTRA_PERMISSION_GRANTEDIntent;
public PendingIntent current_usbpermissionIntent;
public UsbDevice current_usbdevice;
public UsbManager current_usbManager;
private static final String TAG = "usbtestapp";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ContextofMainAcitivity = this;
current_usbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
USBconnectdisconnect_intentFilter = new IntentFilter();
USBconnectdisconnect_intentFilter.addAction(ACTION_USB_PERMISSION);
USBconnectdisconnect_intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
USBconnectdisconnect_intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(currentUSBBroasdcastReceiver, USBconnectdisconnect_intentFilter);
GetEXTRA_PERMISSION_GRANTEDIntent = new Intent(ACTION_USB_PERMISSION);
GetEXTRA_PERMISSION_GRANTEDIntent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false);
Log.v(TAG, "Waiting for USB devices...");
} // create
BroadcastReceiver currentUSBBroasdcastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
switch (action) {
case UsbManager.ACTION_USB_DEVICE_ATTACHED:
current_usbdevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
Log.v(TAG,"ACTION_USB_DEVICE_ATTACHED.");
if (current_usbManager.hasPermission(current_usbdevice)) {
Log.v(TAG,"Permission is already granted.");
return;
}
current_usbpermissionIntent = PendingIntent.getBroadcast(ContextofMainAcitivity, 0, GetEXTRA_PERMISSION_GRANTEDIntent , intentFlags);
if (!current_usbManager.hasPermission(current_usbdevice)) {
Log.v(TAG, "Request Permision from User...");
current_usbManager.requestPermission(current_usbdevice, current_usbpermissionIntent);
}
break;
case UsbManager.ACTION_USB_DEVICE_DETACHED:
Log.v(TAG,"ACTION_USB_DEVICE_DETACHED");
break;
case ACTION_USB_PERMISSION:
if (intent.getBooleanExtra( UsbManager.EXTRA_PERMISSION_GRANTED, false) == true) {
Log.v(TAG,"ACTION_USB_PERMISSION - Granted !");
} else {
Log.v(TAG,"ACTION_USB_PERMISSION - Denied");
}
break;
} //switch
} // onReceive
}; // braadcast
После подключения устройства FTDI FT232 — CDC происходит следующее:
2022- 08-07 14:19:44.206 15767-15767/com.social.usbtestapp V/usbtestapp: Ожидание USB-устройств...
07.08.2022 14:19:50.765 15767 -15767/com.social.usbtestapp V/usbtestapp: ACTION_USB_DEVICE_ATTACHED.
2022-08-07 14:19:50.770 15767-15767/com.social.usbtestapp V/usbtestapp: запросить разрешение от пользователя...
Затем открывается диалоговое окно, в котором отображается строка устройства + запрашивается разрешение у пользователя – независимо от того, что выбрано: ОК или ОТМЕНА, результат всегда:
2022-08-07 14:19:52.759 15767-15767/com.social.usbtestapp V/usbtestapp: ACTION_USB_PERMISSION – Отказано
Я также проверил пример FTDI но, наконец, по своей внутренней функциональности, насколько я понимаю, они делают почти то же самое. Я также проверил StackOverflow
java - UsbDevice requestPermission отклонен без отображения диалогового окна запроса - Stack Overflow, но это не решило мои проблемы.
По какой-то неизвестной причине я получил это также работают, что означает, что после выбора ОК в диалоговом окне разрешений getBooleanExtra( UsbManager.EXTRA_PERMISSION_GRANTED действительно был правдой
при добавлении или удалении некоторых дополнительных SDK, таких как Lolipop или Pie, но я больше не мог воспроизвести это - был бы рад на любое предложение.
Подробнее здесь: https://stackoverflow.com/questions/732 ... lse-always
Мобильная версия