Skip to content

Commit ccf1261

Browse files
Merge pull request #670 from TakayukiHoshi1984/modify_uvc_permission
UVCプラグインのAndroid9対応
2 parents d733fdb + df6429b commit ccf1261

3 files changed

Lines changed: 81 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: 28 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,17 @@
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+
5459
public final class USBMonitor {
5560

5661
private static final boolean DEBUG = false; // TODO set false on production
@@ -384,7 +389,7 @@ public final void dumpDevices() {
384389
* @return true: 指定したUsbDeviceにパーミッションがある
385390
* @throws IllegalStateException
386391
*/
387-
public final boolean hasPermission(final UsbDevice device) throws IllegalStateException {
392+
public final boolean hasPermission(final UsbDevice device) throws IllegalStateException, SecurityException {
388393
if (destroyed) throw new IllegalStateException("already destroyed");
389394
return updatePermission(device, device != null && mUsbManager.hasPermission(device));
390395
}
@@ -474,17 +479,21 @@ public void onReceive(final Context context, final Intent intent) {
474479
final String action = intent.getAction();
475480
if (ACTION_USB_PERMISSION.equals(action)) {
476481
// 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);
483493
}
484-
} else {
485-
// failed to get permission
486-
processCancel(device);
487494
}
495+
} catch (SecurityException e ) {
496+
// ignore
488497
}
489498
} else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
490499
final UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
@@ -522,8 +531,12 @@ public void run() {
522531
synchronized (mHasPermissions) {
523532
hasPermissionCounts = mHasPermissions.size();
524533
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
527540
}
528541
m = mHasPermissions.size();
529542
}
@@ -551,6 +564,7 @@ public void run() {
551564
*/
552565
private final void processConnect(final UsbDevice device) {
553566
if (destroyed) return;
567+
554568
updatePermission(device, true);
555569
mAsyncHandler.post(new Runnable() {
556570
@Override
@@ -646,7 +660,8 @@ public static final String getDeviceKeyName(final UsbDevice device, final boolea
646660
* @return
647661
*/
648662
@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 {
650665
if (device == null) return "";
651666
final StringBuilder sb = new StringBuilder();
652667
sb.append(device.getVendorId()); sb.append("#"); // API >= 12

0 commit comments

Comments
 (0)