11using System . Collections ;
2- using System . Collections . Generic ;
32using UnityEngine ;
43
54namespace NatCorderWithOpenCVForUnityExample
65{
7- public class RuntimePermissionHelper
6+ public class RuntimePermissionHelper : MonoBehaviour
87 {
9- private RuntimePermissionHelper ( )
8+
9+ public virtual IEnumerator hasUserAuthorizedCameraPermission ( )
1010 {
11+ #if UNITY_IOS && UNITY_2018_1_OR_NEWER
12+ UserAuthorization mode = UserAuthorization . WebCam ;
13+ if ( ! Application . HasUserAuthorization ( mode ) ) {
14+ yield return RequestUserAuthorization ( mode ) ;
15+ }
16+ yield return Application . HasUserAuthorization ( mode ) ;
17+ #elif UNITY_ANDROID && UNITY_2018_3_OR_NEWER
18+ string permission = UnityEngine . Android . Permission . Camera ;
19+ if ( ! UnityEngine . Android . Permission . HasUserAuthorizedPermission ( permission ) )
20+ {
21+ yield return RequestUserPermission ( permission ) ;
22+ }
23+ yield return UnityEngine . Android . Permission . HasUserAuthorizedPermission ( permission ) ;
24+ #else
25+ yield return true ;
26+ #endif
1127 }
1228
13- private static AndroidJavaObject GetActivity ( )
29+ public virtual IEnumerator hasUserAuthorizedMicrophonePermission ( )
1430 {
15- using ( var UnityPlayer = new AndroidJavaClass ( "com.unity3d.player.UnityPlayer" ) ) {
16- return UnityPlayer . GetStatic < AndroidJavaObject > ( "currentActivity" ) ;
31+ #if UNITY_IOS && UNITY_2018_1_OR_NEWER
32+ UserAuthorization mode = UserAuthorization . Microphone ;
33+ if ( ! Application . HasUserAuthorization ( mode ) ) {
34+ yield return RequestUserAuthorization ( mode ) ;
35+ }
36+ yield return Application . HasUserAuthorization ( mode ) ;
37+ #elif UNITY_ANDROID && UNITY_2018_3_OR_NEWER
38+ string permission = UnityEngine . Android . Permission . Microphone ;
39+ if ( ! UnityEngine . Android . Permission . HasUserAuthorizedPermission ( permission ) )
40+ {
41+ yield return RequestUserPermission ( permission ) ;
1742 }
43+ yield return UnityEngine . Android . Permission . HasUserAuthorizedPermission ( permission ) ;
44+ #else
45+ yield return true ;
46+ #endif
1847 }
1948
20- private static bool IsAndroidMOrGreater ( )
49+ public virtual IEnumerator hasUserAuthorizedExternalStorageWritePermission ( )
2150 {
22- using ( var VERSION = new AndroidJavaClass ( "android.os.Build$VERSION" ) ) {
23- return VERSION . GetStatic < int > ( "SDK_INT" ) >= 23 ;
51+ #if UNITY_ANDROID && UNITY_2018_3_OR_NEWER
52+ string permission = UnityEngine . Android . Permission . ExternalStorageWrite ;
53+ if ( ! UnityEngine . Android . Permission . HasUserAuthorizedPermission ( permission ) )
54+ {
55+ yield return RequestUserPermission ( permission ) ;
2456 }
57+ yield return UnityEngine . Android . Permission . HasUserAuthorizedPermission ( permission ) ;
58+ #else
59+ yield return true ;
60+ #endif
2561 }
2662
27- public static bool HasPermission ( string permission )
63+ #if ( UNITY_IOS && UNITY_2018_1_OR_NEWER ) || ( UNITY_ANDROID && UNITY_2018_3_OR_NEWER )
64+ protected bool isUserRequestingPermission ;
65+
66+ protected virtual IEnumerator OnApplicationFocus ( bool hasFocus )
2867 {
29- if ( IsAndroidMOrGreater ( ) ) {
30- using ( var activity = GetActivity ( ) ) {
31- return activity . Call < int > ( "checkSelfPermission" , permission ) == 0 ;
32- }
33- }
68+ yield return null ;
3469
35- return true ;
70+ if ( isUserRequestingPermission && hasFocus )
71+ isUserRequestingPermission = false ;
3672 }
3773
38- public static bool ShouldShowRequestPermissionRationale ( string permission )
74+ #if UNITY_IOS
75+ protected virtual IEnumerator RequestUserAuthorization ( UserAuthorization mode )
3976 {
40- if ( IsAndroidMOrGreater ( ) ) {
41- using ( var activity = GetActivity ( ) ) {
42- return activity . Call < bool > ( "shouldShowRequestPermissionRationale" , permission ) ;
77+ isUserRequestingPermission = true ;
78+ yield return Application . RequestUserAuthorization ( mode ) ;
79+
80+ float timeElapsed = 0 ;
81+ while ( isUserRequestingPermission )
82+ {
83+ if ( timeElapsed > 0.25f ) {
84+ isUserRequestingPermission = false ;
85+ yield break ;
4386 }
44- }
87+ timeElapsed += Time . deltaTime ;
4588
46- return false ;
89+ yield return null ;
90+ }
91+ yield break ;
4792 }
48-
49- public static void RequestPermission ( string [ ] permissiions )
93+ #elif UNITY_ANDROID
94+ protected virtual IEnumerator RequestUserPermission ( string permission )
5095 {
51- if ( IsAndroidMOrGreater ( ) ) {
52- using ( var activity = GetActivity ( ) ) {
53- activity . Call ( "requestPermissions" , permissiions , 0 ) ;
96+ isUserRequestingPermission = true ;
97+ UnityEngine . Android . Permission . RequestUserPermission ( permission ) ;
98+
99+ float timeElapsed = 0 ;
100+ while ( isUserRequestingPermission )
101+ {
102+ if ( timeElapsed > 0.25f )
103+ {
104+ isUserRequestingPermission = false ;
105+ yield break ;
54106 }
107+ timeElapsed += Time . deltaTime ;
108+
109+ yield return null ;
55110 }
111+ yield break ;
56112 }
113+ #endif
114+ #endif
57115 }
58116}
0 commit comments