Android Studio 在应用使用的过程中,各种操作需要权限的申请
本文纯菜鸟记录,目录:
- 一、
静态权限
- 二、
动态权限
- 三、
常用权限
前言
- 权限有分静态和动态,静态权限需要在Manifest.xml中声明,动态权限不仅需要在Manifest.xml中声明,还需要在用户软件运行时弹出窗口给用户选择是否同意权限。
- 动态权限是在版本6.0之后才提出的,所以在申请动态权限时都应该先判断一下系统版本。
一、静态权限
静态权限在Manifest.xml中<aplication前填写就行
<!--使用网络权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--读取手机信息权限,6.0到9.0还需要动态申请-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--SD读写权限,6.0到9.0还需要动态申请-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--相机权限,6.0以上还需要动态申请-->
<uses-permission android:name="android.permission.CAMERA" /
<application
...
</application>
二、动态权限
- 步骤1、 前面说过,动态权限需要先在Manifest.xml中申请,后才动态申请,接下来要动态申请的权限在前面静态示例中声明过了。
- 步骤2、 调用申请权限方法前,先判断一下版本,是否是Android 6.0以上
- 步骤3、 使用判断是否已经拥有某权限,已拥有就可以跳过某权限申请
- 步骤4、 是否被用户拒绝,且提示永不提醒,此情景下,当用户再次使用相关功能时,引导用户到系统设置权限页手动开启权限。还有个方法卸载重装。
- 步骤5、 应该在每个需要权限都加上权限判断,避免在有些情况下,原先确认过的权限被修改,可能会导致罪恶的奔溃。。。
代码示例:
//第一次开启程序动态申请权限
private void GetPromission(){
//判断版本,(当前版本 >= 23) ,即大于6.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
List<String> plist = new ArrayList<>();
plist = GetPromissionList();
if (!plist.isEmpty()) {
String[] ps = plist.toArray(new String[plist.size()]);
ActivityCompat.requestPermissions(MainActivity.this, ps, 1);
} else {
//如果权限已经全部申请,也可以分开判断单个权限,
//获取设备唯一标识符
String DeviceId = ((TelephonyManager) getSystemService(MainActivity.this.TELEPHONY_SERVICE)).getDeviceId();
tvlog.append("\r\nDeviceId:" + DeviceId);
}
}else{
//如果设备版本低于6.0,则可自接获取设备唯一标识符
String DeviceId = ((TelephonyManager) getSystemService(MainActivity.this.TELEPHONY_SERVICE)).getDeviceId();
tvlog.append("\r\nDeviceId:" + DeviceId);
}
}
//判断需要的权限,将未获取的权限集合成列表返回
private List<String> GetPromissionList(){
List<String> plist = new ArrayList<>();
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
plist.add(Manifest.permission.CAMERA);
}
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
plist.add(Manifest.permission.READ_EXTERNAL_STORAGE);
}
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
plist.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
plist.add(Manifest.permission.READ_PHONE_STATE);
}
return plist;
}
三、常用权限
静态权限申请格式都是如这样:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
动态权限格式都是如这样:
Manifest.permission.READ_PHONE_STATE
新添加就是替换掉permission.
后的权限名就行。
危险权限共有分为9组,24个权限,后面版本会一直更新
官网权限最新完整列表
以下是早期的危险权限组资料,即需要动态申请的,一组中申请其中一个权限,就可以获得整组的所有权限了,几乎可以当做只有9个权限,前面读写SD卡权限只要其中一个即可以了,而且事实上也只会出现一次请求界面。
- 权限组:权限名
CALENDAR - READ_CALENDAR
- WRITE_CALENDAR
CAMERA - CAMERA
CONTACTS - READ_CONTACTS
- WRITE_CONTACTS
- GET_ACCOUNTS
LOCATION - ACCESS_FINE_LOCATION
- ACCESS_COARSE_LOCATION
MICROPHONE
RECORD_AUDIO
PHONE - READ_PHONE_STATE
- CALL_PHONE
- READ_CALL_LOG
- WRITE_CALL_LOG
- ADD_VOICEMAIL
- USE_SIP
- PROCESS_OUTGOING_CALLS
SENSORS - BODY_SENSORS
SMS - SEND_SMS
- RECEIVE_SMS
- READ_SMS
- RECEIVE_WAP_PUSH
- RECEIVE_MMS
STORAGE - READ_EXTERNAL_STORAGE
- WRITE_EXTERNAL_STORAGE
常用。。。
<!--读取手机信息权限,6.0到9.0还需要动态申请-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 访问读、写sd卡关联目录权限 6.0-9.0需要动态申请,10.0后取消 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 相机权限 需要动态申请-->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 振动需要的权限 -->
<uses-permission android:name="android.permission.VIBRATE" />
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
牢骚。。。
其实大多数权限,就是个摆设,因为用户根本不知道那些权限同意了会有什么隐患,用户只知道,同意了那些xxx权限才能正常使用要用的软件,即使不知道哪里下载来的应用,也照样下载,同意,运行。。。
所以说,权限这东西根本就是鸡肋中的鸡肋。。。只是对那些人来说是个脱干系的“好东西”。。。