赞
踩
这个大家应该都知道,简单设想一下,如果Android没有权限管控,应用安装后就可以通过互联网、蓝牙等方式将读取到得设备信息、账户信息、通讯录、照片、文件、聊天记录…通通发出去,隐私泄露的同时还有可能造成直接的经济损失。如果是这样,那么Android将不复存在,没有人会愿意使用Android设备。
Anroid将权限分为安装时权限,运行时权限和特殊权限。用户可以在系统设置里查看各个应用的权限。
Camera camera = Camera.open();
AndroidManifest中添加权限声明
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
2、使用相关功能时检查权限,动态申请权限
在AndroidManifest添加权限声明后,要在使用相机拍照处增加权限动态申请,由用户在此处点击允许后才可以获得权限,使用相机功能。
先用ContextCompat.checkSelfPermission检查要申请的权限是否被授予,若结果等于PackageManager.PERMISSION_GRANTED则表示权限被授予成功,Android将权限名称定义在Manifest类中。
Android动态权限声明的示例,onRequestPermissionsResult为申请的结果回调。如果权限未被成功授予,禁止使用该功能,但是要让用户能够继续使用其他功能,
/** * 申请权限 */ private void reqigsterPermission() { if(ContextCompat.checkSelfPermission(CameraActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE); } else { Log.d(TAG, " -----已经获取了权限----- "); } } /** * @param requestCode 请求码,和ActivityCompat.requestPermissions申请时指定的对应 * @param permissions 权限名如android.permission.CAMERA * @param grantResults 权限申请结果 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { Log.d(TAG, "onRequestPermissionsResult: " + permissions[0]); if(requestCode == REQUEST_CODE) { if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ Log.d(TAG, "onRequestPermissionsResult 相机权限开启成功!"); } else { Log.d(TAG, "onRequestPermissionsResult 相机权限开启失败!"); finish(); } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } private void initCamera() {
3、动态权限框架介绍
引入,androidx和support需要引入不同的包
// For androidX
implementation 'pub.devrel:easypermissions:3.0.0'
// For Android Support Library
implementation 'pub.devrel:easypermissions:2.0.1'
实现EasyPermission的接口asyPermissions.PermissionCallbacks, EasyPermissions.RationaleCallbacks
public class CameraActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, EasyPermissions.RationaleCallbacks { ... @Override public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) { Log.d(TAG, "onPermissionsGranted 权限申请成功");//这里正常需要判断requestCode,允许后回调 } @Override public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) { Log.d(TAG, "onPermissionsGranted 权限申请失败,用户禁止权限 ");//这里正常需要判断requestCode,拒绝后回调 } @Override public void onRationaleAccepted(int requestCode) { Log.d(TAG, "onRationaleAccepted ");//这里正常需要判断requestCode,提示权限申请额弹框,点击确定时回调,并且弹出权限申请由用户选择授权 } @Override public void onRationaleDenied(int requestCode) { Log.d(TAG, "onRationaleDenied ");//这里正常需要判断requestCode,提示权限申请额弹框,点击取消时回调 } }
在具体功能实现的方法添加注解,如果已经有权限执行相关功能调用,否则由EasyPermission申请权限
@AfterPermissionGranted(PERMISSION_CAMERA)
private void testCamera(){
if (EasyPermissions.hasPermissions(this, permissions)) {
initCamera();
} else {
EasyPermissions.requestPermissions(this, "该权限用于拍摄XXX, 不授予权限不能使用相关功能", PERMISSION_CAMERA, permissions);
}
}
需要实现onRequestPermissionsResult方法,将权限申请的结果交给EasyPermission处理.注意EasyPermissions.onRequestPermissionsResult第四个参数要传上下文,否则即使授权成功onPermissionsGranted也不能正常回调。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
// For Android Support Library
implementation 'io.reactivex.rxjava2:rxjava:2.0.5'
implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
// For androidx
implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'com.github.tbruyelle:rxpermissions:0.12'
获取权限示例
private void requestRxPermission() {
new RxPermissions(this).request(Manifest.permission.CAMERA).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Throwable {
if(aBoolean){
Log.d(TAG, "accept 已获得权限: ");
} else {
Log.d(TAG, "accept 获取权限失败 ");
}
}
});
}
总之,要想做一个优秀的app,权限的获取必须要遵循android权限的相关原则,必须给用户知情权,让用户随时能够拒绝某一权限。针对拍照,我们甚至可以选择不获取相机权限的方式实现,因为在当今网络如此发达的形势下,用户对于软件安全逐渐加强了认知,过多的权限申请,可能导致用户流失。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。