定位權限檢查
export const checkPermission = ( ) => { const platform = uni. getSystemInfoSync ( ) . platform; console. log ( 'platform' , platform) if ( platform === 'android' ) { return checkAndroidPermission ( ) ; } else if ( platform === 'ios' ) { return checkIOSPermission ( ) ; }
} ;
export const checkAndroidPermission = ( ) => { return new Promise ( ( resolve ) => { const main = plus. android. runtimeMainActivity ( ) ; const ActivityCompat = plus. android. importClass ( 'androidx.core.app.ActivityCompat' ) ; const PackageManager = plus. android. importClass ( 'android.content.pm.PackageManager' ) ; const Manifest = plus. android. importClass ( 'android.Manifest' ) ; const ContextCompat = plus. android. importClass ( 'androidx.core.content.ContextCompat' ) ; const hasFineLocation = ContextCompat. checkSelfPermission ( main, Manifest. permission. ACCESS_FINE_LOCATION ) === PackageManager. PERMISSION_GRANTED ; const hasCoarseLocation = ContextCompat. checkSelfPermission ( main, Manifest. permission. ACCESS_COARSE_LOCATION ) === PackageManager. PERMISSION_GRANTED ; if ( ! hasFineLocation && ! hasCoarseLocation) { console. log ( "Android 權限被拒絕" ) resolve ( 2 ) ; return ; } if ( plus. os. version >= 10 ) { const AppOpsManager = plus. android. importClass ( 'android.app.AppOpsManager' ) ; const appOps = main. getSystemService ( 'appops' ) ; const mode = plus. android. invoke ( appOps, 'checkOpNoThrow' , AppOpsManager. OPSTR_FINE_LOCATION , main. getApplicationInfo ( ) . uid, main. getPackageName ( ) ) ; if ( mode === null ) { console. warn ( 'checkOpNoThrow返回null,降級檢查運行時權限' ) ; const hasPermission = ContextCompat. checkSelfPermission ( main, Manifest. permission. ACCESS_FINE_LOCATION ) === PackageManager. PERMISSION_GRANTED ; console. log ( "降級檢查運行hasPermission" , hasPermission) resolve ( hasPermission ? 1 : 2 ) ; return ; } console. log ( "Android===mode" , mode) switch ( mode) { case 0 : console. log ( '始終允許定位' ) ; resolve ( 1 ) ; break ; case 4 : console. log ( '僅允許前臺定位' ) ; resolve ( 1 ) ; break ; case 1 : console. log ( '已拒絕但可再次請求' ) ; resolve ( 1 ) ; break ; case 2 : console. log ( '已永久拒絕需手動設置' ) ; resolve ( 2 ) ; break ; default : console. log ( '其他狀態' , mode) ; } } else { console. log ( "Android 權限始終允許" ) resolve ( 1 ) ; } } ) ;
}
export const checkIOSPermission = ( ) => { console. log ( 'iOS 檢測權限' ) ; return new Promise ( ( resolve, reject ) => { const cllocationManger = plus. ios. import ( 'CLLocationManager' ) ; const status = cllocationManger. authorizationStatus ( ) ; const enable = cllocationManger. locationServicesEnabled ( ) ; console. log ( 'status' , status) ; if ( ! enable) { resolve ( 2 ) ; } else if ( status === 2 ) { resolve ( 2 ) ; } else if ( status === 4 ) { resolve ( 0 ) ; } else if ( status === 3 ) { resolve ( 1 ) ; } else { resolve ( 0 ) ; } plus. ios. deleteObject ( cllocationManger) ; } ) ;
} ;
export const getAndroidLocation = ( ) => { return new Promise ( ( resolve, reject ) => { plus. android. requestPermissions ( [ 'android.permission.ACCESS_FINE_LOCATION' ] , ( result ) => { console. log ( 'android,' , result) ; if ( result. granted. length) { console. log ( 'Android 已授予定位權限' ) ; resolve ( 1 ) ; } else if ( result. deniedAlways. length) { console. log ( 'Android 已拒絕定位權限' ) ; resolve ( 2 ) ; } else { resolve ( 0 ) ; } } , ( error ) => { console. log ( "Android 檢測權限---err" , error) reject ( error) ; } ) ; } )
}
使用
if ( check) { checkPermission ( ) . then ( async code => { uni. setStorageSync ( "locationPermissions" , true ) ; console. log ( "code" , code) if ( code === 0 ) { console. log ( "權限引導" ) } else if ( code === 1 ) { console. log ( "允許" ) ; } else if ( code === 2 ) { console. log ( "跳轉權限設置" ) } } ) . catch ( ( err ) => { console. log ( "報錯" , err) uni. showModal ( { content: '檢測權限失敗,請確認是否打開GPS,再重啟APP' , showCancel: false , confirmText: "去開啟" , success ( res ) { uni. openAppAuthorizeSetting ( ) } } ) } ) }