admin管理员组文章数量:1558087
文章目录
- 简介
- Android5及以下版本
- 安卓6.0引入的运行时权限(runtime permission)功能
简介
安卓不同版本运行时权限(Runtime Permission )表现可能会不同,
为了安全,目前大部分安卓版本某些敏感权限比如:录音,摄像头,发送短信等都,APP调用前都需要先申请对应权限,用户选择“同意”则可正常使用否则对应功能将不能使用。
CTA认证要求低版本的如Android5的apk必须要支持运行时权限,但是其功能是Android6才引入的,需要对Runtime Permission不同版本的表现有个初步认识,好方便针对CTA要求进行修改。
Android5及以下版本
无运行时权限功能,无需在代码中申请权限就可调用,应用安装后会自动获得权限。
安卓5(Lollipop, 21)及以下没有此功能
其可以直接代码中打开摄像头, 创建一个叫TestM的工程,用于测试,
第一步需要声明要求的摄像头权限
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA" />
这个不管哪个版本都需要加,不然无法获取到权限。
第二步app build.gradle中对应如下
targetSdk 21
对应是要求代码运行在android5上。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.result);
startCamera(); // 可直接打开摄像头
}
可在 设置—应用和通知—TestM—权限中查看是否获得权限
android5应用安装后,自动获得权限。
如图1
安卓6.0引入的运行时权限(runtime permission)功能
敏感权限需要代码申请,如未申请到则无法使用
比如摄像头示例
第一步需要声明要求的摄像头权限
AndroidManifest.xml
<uses-permission android:name="android.permission.CAMERA" />
注意如果xml中不添加这行代码,则代码requestPermissions
请求权限时不会弹出权限授权选择框。如果不请求权限直接尝试打开摄像头会失败,错误打印:cannot open camera “1” without camera permission’。
第二步
app的build.gradle需要配置好sdk版本号,其中
targetSdk需要大于等于23, 23对应Android6.0,表示要运行在6.0系统中,则代码会以6.0版本的sdk进行编译生成apk
compileSdk目前的android studio2021只能设置最小值为28,若设置为23会各种编译不过,因为找不到对应的 appcompat版本,比如
28对应的能下载到
implementation ‘com.android.support:appcompat-v7:28.0.0’
而23对应的会下载不到
implementation ‘com.android.support:appcompat-v7:23.0.0’
android {
compileSdk 28
defaultConfig {
minSdk 19
targetSdk 23
…
}
…
}
第三步代码中申请摄像头权限,之前申请成功或者此次申请成功则可打开摄像头
主要是先 checkSelfPermission,如果之前未授权过则调用requestPermissions请求授权。
若不请求权限直接打开摄像头则会失败。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final int FRONT_CAMERA = 1;
private static final int MY_PERMISSIONS_REQUEST = 1000;
Camera mCamera = null;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.result);
getPermissionInfo(); // 如果是6以上版本执行此句
//startCamera(); // 5及以下版本执行此句
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mCamera != null)
mCamera.release();
}
private void getPermissionInfo() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // M为23, 表示版本6.0及以上
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
//版本大于等于6.0的版本,未授权则动态请求授权
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.CAMERA }, MY_PERMISSIONS_REQUEST);
return;
} else {
// PERMISSION_GRANTED 表示已经授权并可以使用
startCamera();
}
} else {//Android6.0以前的版本,可以直接使用
Log.d("", "6.0以前的版本");
startCamera();
}
}
private void startCamera() {
try {
mCamera = Camera.open(FRONT_CAMERA);
Log.d(TAG, "open success");
textView.setText("open camera success");
} catch (RuntimeException e) {
Log.e(TAG, "fail to open camera");
e.printStackTrace();
mCamera = null;
textView.setText("open camera failed");
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// 通过回调,监听用户是否授权
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case MY_PERMISSIONS_REQUEST: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 授权成功
startCamera();
} else {
// 授权失败!
Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT);
}
break;
}
default:
break;
}
}
}
Android6及以上版本,代码中请求权限时,会弹出一个是否允许的选择框,
选中“允许”则获得权限,并可打开摄像头,设置中权限情况如图1;
选中“拒绝”,则无法获得权限,摄像头无法正常打开,
如图3
CTA部分需要针对Android SDK进行修改,使其对Android5的apk也能支持运行时权限,此处不详述。
作者:帅得不敢出门 谢绝转载
本文标签: 各版权限androidRuntimePermission
版权声明:本文标题:Android各版本运行时权限(Runtime Permission )表现 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727362271a1110751.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论