1 如何申请权限的相关代码
以定位权限为例
- 在AndroidManifest.xml 中添加用户权限申明,这一步必须写,不然会不弹窗,直接默认拒绝
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 如果需要精确定位的话请加上此权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 如果需要粗略定位的话请加上此权限 -->
- 发出请求确认本地是否有权限
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
返回结果为PackageManager.PERMISSION_GRANTED
(同意)或者PackageManager.DENIED
(不同意)
- 如果请求结果为不允许,则需手动发出请求
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE_1);
- 接收请求结果,进行解析与后续操作,可以用来输出log、分析问题所在或者自定义的操作
注意,这个代码是在继承了AppCompatActivity的类(如MainActivity.java)中直接重写的
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户已授予权限,执行您的逻辑
Logd("PERMISSION", "位置权限已赋予");
} else {
// 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
Logd("PERMISSION", "位置权限已拒绝");
}
}
2 申请权限的demo(包括定位、存储、卫星、运动健康)
private void requestPermissions() {
// 请求位置权限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_CODE_1);
}
// 申请计步器权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED
&& android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACTIVITY_RECOGNITION}, PERMISSION_REQUEST_CODE_2);
}
// 请求读写文件权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//多个权限一起申请
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE_4);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) {
Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
startActivity(intent);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode){
case PERMISSION_REQUEST_CODE_1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户已授予权限,执行您的逻辑
Logd("PERMISSION", "位置权限已赋予");
} else {
// 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
Logd("PERMISSION", "位置权限已拒绝");
}
break;
case PERMISSION_REQUEST_CODE_2:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户已授予权限,执行您的逻辑
Logd("PERMISSION", "运动权限已赋予");
} else {
// 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
Logd("PERMISSION", "运动权限已拒绝");
}
break;
case PERMISSION_REQUEST_CODE_3:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户已授予权限,执行您的逻辑
Logd("PERMISSION", "卫星权限已赋予");
} else {
// 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
Logd("PERMISSION", "卫星权限已拒绝");
}
break;
case PERMISSION_REQUEST_CODE_4:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户已授予权限,执行您的逻辑
Logd("PERMISSION", "存储权限已赋予");
} else {
// 用户拒绝了权限,您可以在这里处理拒绝权限的逻辑
Logd("PERMISSION", "存储权限已拒绝");
}
break;
}
}
3 申请权限却没有弹窗的一些原因
- 在AndroidManifest.xml中没有加入显式的权限说明
- Android版本比较新,有一些新的要求
如:在Android 10(29)之后,申请文件存储要求在AndroidManifest.xml中的下面增加一句代码
xml android:requestLegacyExternalStorage="true"
- 记得在使用某项具体功能之前,加入申请权限的以上代码。(比如可以在app刚启动时申请)
一般来说,不弹窗基本上可以确定是AndroidManifest.xml里面的权限少写了,拼错了或者漏了某些最新的要求!