在Android开发中,权限是指应用程序需要访问特定的设备功能或数据时所需的用户许可。从Android 6.0(API级别23)开始,Android引入了运行时权限模型,在应用程序运行期间向用户请求权限,而不是在安装时请求。
举例手机外部读写和设备状态权限
1.Android 5.1(API级别22)及以下:
a.手机外部读写权限(WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE):
说明:在这些较旧的系统版本中,这些权限通常在应用安装时由用户授予,无需动态请求。
举例:您可以在应用的AndroidManifest.xml文件中声明这些权限,系统安装应用时会自动向用户请求授权。
b.设备状态权限(READ_PHONE_STATE):
说明:同样在应用安装时由用户授予。
举例:同样在AndroidManifest.xml文件中声明权限即可。
2.Android 6.010.0(API级别2329):
a.手机外部读写权限(WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE):
说明:在Android 6.0及以上版本中,这些权限属于危险权限,需要在运行时动态请求。
申请方法:您需要在应用程序运行时检查权限是否已经授予,如果没有授予,您需要向用户请求权限。例如:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 如果权限尚未授予,则请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_WRITE_EXTERNAL_STORAGE_CODE);
}
b.设备状态权限(READ_PHONE_STATE):
说明:同样属于危险权限,在Android 6.0及以上版本中需要在运行时动态请求。
申请方法:与上述类似,您需要在运行时请求该权限。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED) {
// 如果权限尚未授予,则请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE},
REQUEST_READ_PHONE_STATE_CODE);
c.处理动态权限授权结果
@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for (int p = 0; p < permissions.length; p++) {
Log.e(TAG,"permissions["+p+"] = " +permissions[p] +" , grantResults["+p+"] = " +grantResults[p] );
}
}
3.Android 11(API级别30)及以上:
a.手机外部读写权限(MANAGE_EXTERNAL_STORAGE):
在AndroidManifest.xml文件中声明权限:
动态申请:
boolean externalStorageManager = Environment.isExternalStorageManager();
用程序是否具有 MANAGE_EXTERNAL_STORAGE 权限,该权限可以管理外部存储空间:" + externalStorageManager
// 是否已获取权限
if (externalStorageManager == false) {
// 应用程序没有 MANAGE_EXTERNAL_STORAGE 权限,需要请求该权限
//申请所有文件访问权限
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse(String.format("package:%s", getApplicationContext().getPackageName())));
startActivityForResult(intent, ANDROID11_REQUEST_CODE);
}
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末优快云官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题