Android内容提供器——运行权限

Posted Mask_D

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android内容提供器——运行权限相关的知识,希望对你有一定的参考价值。

程序运行是的权限分为两种,一种是普通权限,一种是危险权限。普通权限的话可以直接使用,只有危险权限需要询问用户的同意。

危险权限分组以及组内权限如下:

注:危险权限同一组内有一项权限被授权,则一组权限都被授权。

 1 group:android.permission-group.CONTACTS
 2   permission:android.permission.WRITE_CONTACTS
 3   permission:android.permission.GET_ACCOUNTS
 4   permission:android.permission.READ_CONTACTS
 5 
 6 group:android.permission-group.PHONE
 7   permission:android.permission.READ_CALL_LOG
 8   permission:android.permission.READ_PHONE_STATE
 9   permission:android.permission.CALL_PHONE
10   permission:android.permission.WRITE_CALL_LOG
11   permission:android.permission.USE_SIP
12   permission:android.permission.PROCESS_OUTGOING_CALLS
13   permission:com.android.voicemail.permission.ADD_VOICEMAIL
14 
15 group:android.permission-group.CALENDAR
16   permission:android.permission.READ_CALENDAR
17   permission:android.permission.WRITE_CALENDAR
18 
19 group:android.permission-group.CAMERA
20   permission:android.permission.CAMERA
21 
22 group:android.permission-group.SENSORS
23   permission:android.permission.BODY_SENSORS
24 
25 group:android.permission-group.LOCATION
26   permission:android.permission.ACCESS_FINE_LOCATION
27   permission:android.permission.ACCESS_COARSE_LOCATION
28 
29 group:android.permission-group.STORAGE
30   permission:android.permission.READ_EXTERNAL_STORAGE
31   permission:android.permission.WRITE_EXTERNAL_STORAGE
32 
33 group:android.permission-group.MICROPHONE
34   permission:android.permission.RECORD_AUDIO
35 
36 group:android.permission-group.SMS
37   permission:android.permission.READ_SMS
38   permission:android.permission.RECEIVE_WAP_PUSH
39   permission:android.permission.RECEIVE_MMS
40   permission:android.permission.RECEIVE_SMS
41   permission:android.permission.SEND_SMS
42   permission:android.permission.READ_CELL_BROADCASTS

申请权限:

以获取拨打电话call权限为例。

首先在 AndroidManifest.xml 文件中声明所需的权限:

<uses-permission android:name="android.permission.CALL_PHONE"/>

在布局文件中设置一个按钮,然后在MainActivity中编写相关申请权限的逻辑。

申请主要分三个部分:

1.设置按钮点击事件,通过checkSelfPermission方法来判断是否有相关权限,如果没有权限,则调用requestPermissions方法来询问用户是否授权,如果有权限,则直接调用call()来进行执行。

2.在第一步调用完requestPermissions方法后,无论用户选择授权与否,都会回调到onRequestPermissionsResult()方法中,授权结果封装在grantResults参数中,所以判断授权结果,如果授权同意,则调用call方法,不同意则提示未获得授权。

3.call方法具体,使用隐身intent方法,动作为拨打电话,并设置相应电话号码,执行intent动作。为了防止程序奔溃,这些放在try方法里执行。

代码如下:

 1 public class MainActivity extends AppCompatActivity {
 2 
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7 
 8         /*设置按钮点击事件,通过checkSelfPermission方法来判断是否有相关权限
 9         * 如果没有权限,则调用requestPermissions方法来询问用户是否授权
10         * 如果有权限,则直接调用call()来进行执行*/
11         Button makeCall = (Button) findViewById(R.id.make_call);
12         makeCall.setOnClickListener(new View.OnClickListener() {
13             @Override
14             public void onClick(View view) {
15                 /*该方法传入两个参数,第一个是context,第二个是要获得的权限名。
16                 将返回值与PackageManager.PERMISSION_GRANTED做比较*/
17                 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)
18                         != PackageManager.PERMISSION_GRANTED) {
19                     /*为获得授权,调用requestPermissions方法向用户申请授权,
20                     传入三个参数:context,获得的权限名字符串,以及请求码,唯一值即可。*/
21                     ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
22                 } else {
23                     call();
24                 }
25             }
26         });
27     }
28 
29     /*call方法具体,使用隐身intent方法,动作为拨打电话,并设置相应电话号码,执行intent动作。
30     * 为了防止程序奔溃,这些放在try方法里执行。*/
31     private void call() {
32         try {
33             Intent intent = new Intent(Intent.ACTION_CALL);
34             intent.setData(Uri.parse("tel:10086"));
35             startActivity(intent);
36         } catch (SecurityException e) {
37             e.printStackTrace();
38         }
39     }
40 
41     @Override
42     public void onRequestPermissionsResult(int requestCode, String[] permissions,
43                                            int[] grantResults) {
44         switch (requestCode) {
45             case 1:
46                 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
47                     call();
48                 } else {
49                     Toast.makeText(this, "you denied the permission", Toast.LENGTH_LONG).show();
50                 }
51                 break;
52             default:
53         }
54     }
55 }

 

以上是关于Android内容提供器——运行权限的主要内容,如果未能解决你的问题,请参考以下文章

Android第一行代码-内容提供器(ContextProviderContextResolver)

Android第一行代码-内容提供器(ContextProviderContextResolver)

Android内容提供器——运行权限

Android-内容提供器一(Android运行时权限)

Android-Android内容提供器之运行时权限

Android基础知识——探究内容提供器