|
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 | +import org.deviceconnect.android.activity.PermissionUtility; |
| 59 | + |
54 | 60 | public final class USBMonitor { |
55 | 61 |
|
56 | 62 | private static final boolean DEBUG = false; // TODO set false on production |
@@ -384,7 +390,7 @@ public final void dumpDevices() { |
384 | 390 | * @return true: 指定したUsbDeviceにパーミッションがある |
385 | 391 | * @throws IllegalStateException |
386 | 392 | */ |
387 | | - public final boolean hasPermission(final UsbDevice device) throws IllegalStateException { |
| 393 | + public final boolean hasPermission(final UsbDevice device) throws IllegalStateException, SecurityException { |
388 | 394 | if (destroyed) throw new IllegalStateException("already destroyed"); |
389 | 395 | return updatePermission(device, device != null && mUsbManager.hasPermission(device)); |
390 | 396 | } |
@@ -474,17 +480,21 @@ public void onReceive(final Context context, final Intent intent) { |
474 | 480 | final String action = intent.getAction(); |
475 | 481 | if (ACTION_USB_PERMISSION.equals(action)) { |
476 | 482 | // 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); |
| 483 | + try { |
| 484 | + synchronized (USBMonitor.this) { |
| 485 | + final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); |
| 486 | + if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { |
| 487 | + if (device != null) { |
| 488 | + // get permission, call onConnect |
| 489 | + processConnect(device); |
| 490 | + } |
| 491 | + } else { |
| 492 | + // failed to get permission |
| 493 | + processCancel(device); |
483 | 494 | } |
484 | | - } else { |
485 | | - // failed to get permission |
486 | | - processCancel(device); |
487 | 495 | } |
| 496 | + } catch (SecurityException e ) { |
| 497 | + // ignore |
488 | 498 | } |
489 | 499 | } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { |
490 | 500 | final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); |
@@ -522,8 +532,12 @@ public void run() { |
522 | 532 | synchronized (mHasPermissions) { |
523 | 533 | hasPermissionCounts = mHasPermissions.size(); |
524 | 534 | mHasPermissions.clear(); |
525 | | - for (final UsbDevice device: devices) { |
526 | | - hasPermission(device); |
| 535 | + try { |
| 536 | + for (final UsbDevice device : devices) { |
| 537 | + hasPermission(device); |
| 538 | + } |
| 539 | + } catch (SecurityException e) { |
| 540 | + // ignore |
527 | 541 | } |
528 | 542 | m = mHasPermissions.size(); |
529 | 543 | } |
@@ -551,6 +565,7 @@ public void run() { |
551 | 565 | */ |
552 | 566 | private final void processConnect(final UsbDevice device) { |
553 | 567 | if (destroyed) return; |
| 568 | + |
554 | 569 | updatePermission(device, true); |
555 | 570 | mAsyncHandler.post(new Runnable() { |
556 | 571 | @Override |
@@ -646,7 +661,8 @@ public static final String getDeviceKeyName(final UsbDevice device, final boolea |
646 | 661 | * @return |
647 | 662 | */ |
648 | 663 | @SuppressLint("NewApi") |
649 | | - public static final String getDeviceKeyName(final UsbDevice device, final String serial, final boolean useNewAPI) { |
| 664 | + public static final String getDeviceKeyName(final UsbDevice device, final String serial, final boolean useNewAPI) |
| 665 | + throws SecurityException { |
650 | 666 | if (device == null) return ""; |
651 | 667 | final StringBuilder sb = new StringBuilder(); |
652 | 668 | sb.append(device.getVendorId()); sb.append("#"); // API >= 12 |
|
0 commit comments