Skip to content

Commit 7ac990c

Browse files
Android9以上からCameraのパーミッションが必要になったため、確認処理を入れた。
1 parent 47d40ca commit 7ac990c

3 files changed

Lines changed: 82 additions & 24 deletions

File tree

dConnectDevicePlugin/dConnectDeviceUVC/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<uses-feature android:name="android.hardware.usb.host" />
66

77
<uses-permission android:name="android.permission.INTERNET" />
8-
8+
<uses-permission android:name="android.permission.CAMERA" />
99
<application
1010
android:name=".UVCDeviceApplication"
1111
android:icon="@drawable/dconnect_icon"
@@ -64,11 +64,6 @@
6464
android:excludeFromRecents="true"
6565
android:exported="false" >
6666
</activity>
67-
68-
<service
69-
android:name="org.deviceconnect.android.localoauth.LocalOAuth2Service"
70-
android:exported="false" >
71-
</service>
7267
</application>
7368

7469
</manifest>

dConnectDevicePlugin/dConnectDeviceUVC/app/src/main/java/org/deviceconnect/android/deviceplugin/uvc/UVCDeviceService.java

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@
77
package org.deviceconnect.android.deviceplugin.uvc;
88

99

10+
import android.Manifest;
11+
import android.content.BroadcastReceiver;
12+
import android.content.Context;
13+
import android.content.Intent;
14+
import android.content.IntentFilter;
15+
import android.hardware.usb.UsbManager;
16+
import android.os.Handler;
17+
import android.os.Looper;
18+
19+
import androidx.annotation.NonNull;
20+
21+
import org.deviceconnect.android.activity.PermissionUtility;
1022
import org.deviceconnect.android.deviceplugin.uvc.activity.ErrorDialogActivity;
1123
import org.deviceconnect.android.deviceplugin.uvc.core.UVCDevice;
1224
import org.deviceconnect.android.deviceplugin.uvc.core.UVCDeviceManager;
@@ -29,14 +41,34 @@ public class UVCDeviceService extends DConnectMessageService {
2941

3042
private UVCDeviceManager mDeviceMgr;
3143

44+
private BroadcastReceiver mPermissionReceiver = new BroadcastReceiver() {
45+
@Override
46+
public void onReceive(Context context, Intent intent) {
47+
PermissionUtility.requestPermissions(context,
48+
new Handler(Looper.getMainLooper()),
49+
new String[]{Manifest.permission.CAMERA},
50+
new PermissionUtility.PermissionRequestCallback() {
51+
52+
@Override
53+
public void onSuccess() {
54+
mDeviceMgr = ((UVCDeviceApplication) getApplication()).getDeviceManager();
55+
mDeviceMgr.addDeviceListener(mDeviceListener);
56+
mDeviceMgr.addConnectionListener(mConnectionListener);
57+
mDeviceMgr.start();
58+
}
59+
60+
@Override
61+
public void onFail(@NonNull String s) {
62+
63+
}
64+
});
65+
}
66+
};
3267
@Override
3368
public void onCreate() {
3469
super.onCreate();
70+
registerReceiver(mPermissionReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED));
3571

36-
mDeviceMgr = ((UVCDeviceApplication) getApplication()).getDeviceManager();
37-
mDeviceMgr.addDeviceListener(mDeviceListener);
38-
mDeviceMgr.addConnectionListener(mConnectionListener);
39-
mDeviceMgr.start();
4072
}
4173

4274
@Override
@@ -49,6 +81,7 @@ public void onDestroy() {
4981
mDeviceMgr.removeDeviceListener(mDeviceListener);
5082
mDeviceMgr.removeConnectionListener(mConnectionListener);
5183
mDeviceMgr.stop();
84+
unregisterReceiver(mPermissionReceiver);
5285
super.onDestroy();
5386
}
5487

@@ -74,7 +107,21 @@ protected void onDevicePluginReset() {
74107
if (BuildConfig.DEBUG) {
75108
mLogger.info("Plug-in : onDevicePluginReset");
76109
}
77-
resetPluginResource();
110+
PermissionUtility.requestPermissions(this,
111+
new Handler(Looper.getMainLooper()),
112+
new String[]{Manifest.permission.CAMERA},
113+
new PermissionUtility.PermissionRequestCallback() {
114+
115+
@Override
116+
public void onSuccess() {
117+
resetPluginResource();
118+
}
119+
120+
@Override
121+
public void onFail(@NonNull String s) {
122+
123+
}
124+
});
78125
}
79126

80127
@Override

dConnectDevicePlugin/dConnectDeviceUVC/libuvccamera/src/main/java/com/serenegiant/usb/USBMonitor.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.Set;
3434
import java.util.concurrent.ConcurrentHashMap;
3535

36+
import android.Manifest;
3637
import android.annotation.SuppressLint;
3738
import android.app.PendingIntent;
3839
import android.content.BroadcastReceiver;
@@ -44,13 +45,18 @@
4445
import android.hardware.usb.UsbInterface;
4546
import android.hardware.usb.UsbManager;
4647
import android.os.Handler;
48+
import android.os.Looper;
4749
import android.text.TextUtils;
4850
import android.util.Log;
4951
import android.util.SparseArray;
5052

53+
import androidx.annotation.NonNull;
54+
5155
import com.serenegiant.utils.BuildCheck;
5256
import com.serenegiant.utils.HandlerThreadHandler;
5357

58+
import org.deviceconnect.android.activity.PermissionUtility;
59+
5460
public final class USBMonitor {
5561

5662
private static final boolean DEBUG = false; // TODO set false on production
@@ -384,7 +390,7 @@ public final void dumpDevices() {
384390
* @return true: 指定したUsbDeviceにパーミッションがある
385391
* @throws IllegalStateException
386392
*/
387-
public final boolean hasPermission(final UsbDevice device) throws IllegalStateException {
393+
public final boolean hasPermission(final UsbDevice device) throws IllegalStateException, SecurityException {
388394
if (destroyed) throw new IllegalStateException("already destroyed");
389395
return updatePermission(device, device != null && mUsbManager.hasPermission(device));
390396
}
@@ -474,17 +480,21 @@ public void onReceive(final Context context, final Intent intent) {
474480
final String action = intent.getAction();
475481
if (ACTION_USB_PERMISSION.equals(action)) {
476482
// 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);
483494
}
484-
} else {
485-
// failed to get permission
486-
processCancel(device);
487495
}
496+
} catch (SecurityException e ) {
497+
// ignore
488498
}
489499
} else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
490500
final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
@@ -522,8 +532,12 @@ public void run() {
522532
synchronized (mHasPermissions) {
523533
hasPermissionCounts = mHasPermissions.size();
524534
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
527541
}
528542
m = mHasPermissions.size();
529543
}
@@ -551,6 +565,7 @@ public void run() {
551565
*/
552566
private final void processConnect(final UsbDevice device) {
553567
if (destroyed) return;
568+
554569
updatePermission(device, true);
555570
mAsyncHandler.post(new Runnable() {
556571
@Override
@@ -646,7 +661,8 @@ public static final String getDeviceKeyName(final UsbDevice device, final boolea
646661
* @return
647662
*/
648663
@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 {
650666
if (device == null) return "";
651667
final StringBuilder sb = new StringBuilder();
652668
sb.append(device.getVendorId()); sb.append("#"); // API >= 12

0 commit comments

Comments
 (0)