定位权限检查
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 ( ) } } ) } ) }