# Android 权限
介绍
权限嘛就是为了保护用户的各种信息安全给APP做的规范,没有用户愿意在毫不知情的情况下允许一款APP直接浏览自己的相册,有的话,当我没说。。。在Android中呢,权限也是有区别的,其一:普通权限,不会直接威胁到用户的安全和隐私的权限,这种权限直接在Manifest.xml文件中声明一下即可,系统会自动帮我们进行授权;其二:危险权限,可能会触及用户隐私或者对设备安全性造成影响的权限,如短信、联系人信息等,这种要用户手动点击授权才可;其三:特殊权限,这种一般用不到,就不了了之了
危险权限表https://developer.android.google.cn/reference/android/Manifest.permission?hl=en:
权限组名 | *权限名* |
---|---|
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 |
表格中每个危险权限都属于一个权限组,我们在申请权限时用的是权限名,但是一旦获得授权,那么该权限组中的所有其他权限也都会被授权!
实例
代码实例
编写修改activity_main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/call"
android:text="打个电话"/>
</LinearLayout>
编写修改MainActivity.java文件:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.call).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat.checkSelfPermission(MainActivity.this , Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this , new String[]{Manifest.permission.CALL_PHONE} , 1);
} else {
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10010"));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10010"));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
} else {
Toast.makeText(this , "你不给权限用不了的呀" , Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
首先通过方法ContextCompat.checkSelfPermission判断用户是否给过该权限的授权,参数其一:context,其二:具体的权限名,然后与PackageManager.PERMISSION_GRANTED作比较,如果相等说明已经授权,反之则没有。
如果已经授权,则直接拨打电话:创建一个Intent实例,指定action为Intent.ACTION_CALL,这个是系统内置的打电话的动作,在data部分指定了协议是tel,号码是;10010,移动你改改呀!
如果没有授权的话啊,这就很烦人了,使用方法ActivityCompat.requestPermissions进行申请,参数其一:context,其二:需要申请的权限名构成的String数组,其三:请求码,传入1就完事了!当用户选择完是否同意之后,都会回调方法onRequestPermissionsResult,授权结果封装在requestCode中,然后判断是否同意处理对应逻辑即可,代码与上面的差不多!
编写修改AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.jurisdiction">
<uses-permission android:name="android.permission.CALL_PHONE"/>
。。。
</manifest>
加一个权限即可!
成果展示
点击按钮之后就是这个样子哒!
点击拒绝:
点击允许:
如果你已经允许过了,那下次点击的时候就会直接拨打了嗷!
小结
权限其实很简单,有两种思路,其一:全给他申请了,下次就不用那么麻烦了,但是用户会很烦;其二:一个一个申请!本人比较偏向第二种,因为要的其实不多,而且申请一个权限就会把对应权限组一并申请了,这不是很方便的咩!