背景
在android6.0以后的更高的android版本中,为了提高用户的隐私安全,应用的权限被分为不同的组别,并且对某些敏感的权限(例如访问照片、通讯录等)需要在运行时动态授权,以提高用户隐私保护。这种方式可以使应用程序更加透明和安全,同时也保护了用户的权利。
1.普通权限
这些权限属于应用程序的基本功能范围,不会直接涉及到用户的隐私或安全问题。普通权限在应用程序安装时自动授予,并无需用户的明确许可。例如,访问互联网、读取设备状态和标识等。
android.permission.ACCESS_NETWORK_STATE:访问网络状态,包括检查网络连接是否可用和获取网络类型。
android.permission.ACCESS_WIFI_STATE:访问Wi-Fi网络状态,包括获取当前连接的Wi-Fi信息。
android.permission.BLUETOOTH:使用蓝牙功能,包括与其他蓝牙设备进行通信。
android.permission.READ_PHONE_STATE:读取设备的电话状态和标识,包括获取IMEI号码和电话号码等信息。
android.permission.RECEIVE_BOOT_COMPLETED:接收开机完成的广播,以便应用程序在设备启动时执行特定操作。
android.permission.WAKE_LOCK:防止设备进入休眠状态,以便应用程序可以在后台继续运行。
2.敏感权限
这些权限涉及到用户的个人隐私或设备的核心功能,可能对用户的数据和安全造成潜在风险。敏感权限需要在运行时动态授权,用户必须明确同意才能使用。例如,访问联系人、获取位置信息、读取短信等。
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
在这分别有读取音频、图片、视频的权限。在这篇文章中举例他们三个权限的申请。
3.权限申请
-
申请详解
我们先定义权限数组,将我们需要申请的权限放进去。
-
Manifest.permission.ACCESS_FINE_LOCATION:位置读取权限
-
Manifest.permission.CAMERA:相机使用权限
-
READ_MEDIA_AUDIO:读取音频权限
-
READ_MEDIA_IMAGES:读取图片权限
-
READ_MEDIA_VIDEO:读取视频权限
-
private static String[] PERMISSIONS_STORAGE = { Manifest.permission.ACCESS_FINE_LOCATION,READ_INPUT_STATE,
Manifest.permission.CAMERA,
READ_MEDIA_IMAGES,
READ_MEDIA_AUDIO,
READ_MEDIA_VIDEO};
这个代码在oncreate方法中执行,如果没同意权限会出现权限管理窗口。
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
Toast.makeText(this, "请允许读取权限", Toast.LENGTH_SHORT).show();
}
}
申请之后的操作:
我们重写onRequestPermissionsResult方法,对权限申请后的操作重写,自定义权限申请后置操作。
//请求状态码
private static int REQUEST_PERMISSION_CODE = 1;
//权限申请后执行方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CODE) {
int PERMISSION_CODE = 0;
for (int i = 0; i < permissions.length; i++) {
Log.i("MainActivity", "申请的权限为:" + permissions[i] + ",申请结果:" + grantResults[i]);
Log.i("MainActivity", "权限数量:" + permissions.length);
PERMISSION_CODE = grantResults[i];
}
if (PERMISSION_CODE==-1){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("请点击确定并手动授予权限");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 打开应用程序设置页面
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse("package:" + getPackageName()));
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
builder.setNegativeButton("取消", null);
builder.show();
}
}
}
当我们没有获取到权限后,打开app会检查你是否获取权限,如果没有,会出现弹窗,点击确定跳转到设置页面,以便获取权限。