|
33 | 33 | import java.util.Set; |
34 | 34 | import java.util.concurrent.ConcurrentHashMap; |
35 | 35 |
|
| 36 | +import android.Manifest; |
36 | 37 | import android.annotation.SuppressLint; |
37 | 38 | import android.app.PendingIntent; |
38 | 39 | import android.content.BroadcastReceiver; |
|
44 | 45 | import android.hardware.usb.UsbInterface; |
45 | 46 | import android.hardware.usb.UsbManager; |
46 | 47 | import android.os.Handler; |
| 48 | +import android.os.Looper; |
47 | 49 | import android.text.TextUtils; |
48 | 50 | import android.util.Log; |
49 | 51 | import android.util.SparseArray; |
50 | 52 |
|
| 53 | +import androidx.annotation.NonNull; |
| 54 | + |
51 | 55 | import com.serenegiant.utils.BuildCheck; |
52 | 56 | import com.serenegiant.utils.HandlerThreadHandler; |
53 | 57 |
|
| 58 | + |
54 | 59 | public final class USBMonitor { |
55 | 60 |
|
56 | 61 | private static final boolean DEBUG = false; // TODO set false on production |
@@ -384,7 +389,7 @@ public final void dumpDevices() { |
384 | 389 | * @return true: 指定したUsbDeviceにパーミッションがある |
385 | 390 | * @throws IllegalStateException |
386 | 391 | */ |
387 | | - public final boolean hasPermission(final UsbDevice device) throws IllegalStateException { |
| 392 | + public final boolean hasPermission(final UsbDevice device) throws IllegalStateException, SecurityException { |
388 | 393 | if (destroyed) throw new IllegalStateException("already destroyed"); |
389 | 394 | return updatePermission(device, device != null && mUsbManager.hasPermission(device)); |
390 | 395 | } |
@@ -474,17 +479,21 @@ public void onReceive(final Context context, final Intent intent) { |
474 | 479 | final String action = intent.getAction(); |
475 | 480 | if (ACTION_USB_PERMISSION.equals(action)) { |
476 | 481 | // when received the result of requesting USB permission |
477 | | - synchronized (USBMonitor.this) { |
478 | | - final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); |
479 | | - if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { |
480 | | - if (device != null) { |
481 | | - // get permission, call onConnect |
482 | | - processConnect(device); |
| 482 | + try { |
| 483 | + synchronized (USBMonitor.this) { |
| 484 | + final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); |
| 485 | + if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { |
| 486 | + if (device != null) { |
| 487 | + // get permission, call onConnect |
| 488 | + processConnect(device); |
| 489 | + } |
| 490 | + } else { |
| 491 | + // failed to get permission |
| 492 | + processCancel(device); |
483 | 493 | } |
484 | | - } else { |
485 | | - // failed to get permission |
486 | | - processCancel(device); |
487 | 494 | } |
| 495 | + } catch (SecurityException e ) { |
| 496 | + // ignore |
488 | 497 | } |
489 | 498 | } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { |
490 | 499 | final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); |
@@ -522,8 +531,12 @@ public void run() { |
522 | 531 | synchronized (mHasPermissions) { |
523 | 532 | hasPermissionCounts = mHasPermissions.size(); |
524 | 533 | mHasPermissions.clear(); |
525 | | - for (final UsbDevice device: devices) { |
526 | | - hasPermission(device); |
| 534 | + try { |
| 535 | + for (final UsbDevice device : devices) { |
| 536 | + hasPermission(device); |
| 537 | + } |
| 538 | + } catch (SecurityException e) { |
| 539 | + // ignore |
527 | 540 | } |
528 | 541 | m = mHasPermissions.size(); |
529 | 542 | } |
@@ -551,6 +564,7 @@ public void run() { |
551 | 564 | */ |
552 | 565 | private final void processConnect(final UsbDevice device) { |
553 | 566 | if (destroyed) return; |
| 567 | + |
554 | 568 | updatePermission(device, true); |
555 | 569 | mAsyncHandler.post(new Runnable() { |
556 | 570 | @Override |
@@ -646,7 +660,8 @@ public static final String getDeviceKeyName(final UsbDevice device, final boolea |
646 | 660 | * @return |
647 | 661 | */ |
648 | 662 | @SuppressLint("NewApi") |
649 | | - public static final String getDeviceKeyName(final UsbDevice device, final String serial, final boolean useNewAPI) { |
| 663 | + public static final String getDeviceKeyName(final UsbDevice device, final String serial, final boolean useNewAPI) |
| 664 | + throws SecurityException { |
650 | 665 | if (device == null) return ""; |
651 | 666 | final StringBuilder sb = new StringBuilder(); |
652 | 667 | sb.append(device.getVendorId()); sb.append("#"); // API >= 12 |
|
0 commit comments