醒来哀愁 發表於 2020-3-28 20:38:00

23. Android开发笔记:权限

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>1. Android权限</li><li>2. 运行时权限</li><li>2.1 Android权限机制<ul><li><ul><li>2.1.1 Android的权限机制是什么样的</li><li>2.1.2 权限分类</li></ul></li></ul></li><li>3.权限案例</li></ul></div><p></p>
<h1 id="1-android权限">1. Android权限</h1>
<p>​      xxx</p>
<h1 id="2-运行时权限">2. 运行时权限</h1>
<h1 id="21-android权限机制">2.1 Android权限机制</h1>
<h3 id="211-android的权限机制是什么样的">2.1.1 Android的权限机制是什么样的</h3>
<p>比如:为了要访问系统的网络状态以及监听开机广播,于是在<code>AndroidManifest.xml</code>文件中添加了这样两句权限声明:</p>
<pre><code class="language-xml">   &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"   
          package="com.example.broadcasttest"&gt;   
             &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;   
             &lt;uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /&gt;   
         ...

   &lt;/manifest&gt;
</code></pre>
<p>因为访问系统的网络状态以及监听开机广播涉及了用户设备的安全性,因此必须在<code>AndroidManifest.xml</code>中加入权限声明,否则我们的程序就会<strong>崩溃</strong>。</p>
<p>那么现在问题来了,加入了这两句权限声明后,对于用户来说到底有什么影响呢?为什么这样就可以保护用户设备的安全性了呢?<br>
其实用户主要在以下两个方面得到了保护:</p>
<p>(1)如果用户在<strong>低于6.0系统</strong>的设备上安装该程序:<br>
会在<strong>安装界面</strong>上所示的提醒。这样用户就可以清楚地知晓该程序一共申请了哪些权限,从而<strong>决定是否要安装这个程序</strong>。</p>
<p>缺点:<strong>我们依赖性很大的软件容易强制获取用户权限,不同意任何一项权限都无法无法安装使用</strong></p>
<p>所以引入了<strong>运行时权限</strong></p>
<p>(2)如果用户在<strong>6.0机及其以上系统</strong>的设备上安装该程序:</p>
<p>用户不需要在安装软件的时候一次性授权所有申请的权限,而是可以在软件的<strong>使用过程中再对某一项权限申请进行授权</strong>。比如说一款相机应用在运行时申请了地理位置定位权限,就算我拒绝了这个权限,但是我应该仍然可以使用这个应用的其他功能,而不是像之前那样直接无法安装它。</p>
<h3 id="212-权限分类">2.1.2 权限分类</h3>
<ul>
<li>
<p>普通权限</p>
<p>指的是那些不会直接威胁到用户的安全和隐私的权限,对于这部分权限申请,系统会自动帮我们进行授权,而不需要用户再去手动操作了,比如获取网络状态、开机状态</p>
</li>
<li>
<p>危险权限</p>
</li>
</ul>
<p>​       那些可能会触及用户隐私或者对设备安全性造成影响的权限,如获取设备联系人信息、定位设备的地理位置等,对于这部分权限申请,必须要由用户手动点击授权才可以,否则程序就无法使用相应的功能。</p>
<p>​      Android中有一共有上百种权限,我们怎么从中区分哪些是普通权限,哪些是危险权限呢?其实并没有那么难,因为危险权限总共就那么几个,除了危险权限之外,剩余的就都是普通权限了。下表列出了Android中所有的危险权限,一共是9组24个权限。</p>
<p><strong>危险权限列表</strong></p>
<table>
<thead>
<tr>
<th style="text-align: center">编号</th>
<th style="text-align: center">权限组</th>
<th style="text-align: center">权限</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center">1</td>
<td style="text-align: center">CALENDAR (日历)</td>
<td style="text-align: center">READ_CALENDAR   WRITE_CALENDAR</td>
</tr>
<tr>
<td style="text-align: center">2</td>
<td style="text-align: center">CAMERA (相机)</td>
<td style="text-align: center">CAMERA</td>
</tr>
<tr>
<td style="text-align: center">3</td>
<td style="text-align: center">CONTACTS (联系人)</td>
<td style="text-align: center">READ_CONTACTS   WRITE_CONTACTS   GET_ACCOUNTS</td>
</tr>
<tr>
<td style="text-align: center">4</td>
<td style="text-align: center">LOCATION (位置)</td>
<td style="text-align: center">ACCESS_FINE_LOCATION   ACCESS_COARSE_LOCATION</td>
</tr>
<tr>
<td style="text-align: center">5</td>
<td style="text-align: center">MICROPHONE (麦克风)</td>
<td style="text-align: center">RECORD_AUDIO</td>
</tr>
<tr>
<td style="text-align: center">6</td>
<td style="text-align: center">PHONE (手机)</td>
<td style="text-align: center">READ_PHONE_STATE   CALL_PHONE   READ_CALL_LOG   WRITE_CALL_LOG   ADD_VOICEMAIL   USE_SIP   PROCESS_OUTGOING_CALLS</td>
</tr>
<tr>
<td style="text-align: center">7</td>
<td style="text-align: center">SENSORS (传感器)</td>
<td style="text-align: center">BODY_SENSORS</td>
</tr>
<tr>
<td style="text-align: center">8</td>
<td style="text-align: center">SMS (短信)</td>
<td style="text-align: center">SEND_SMS   RECEIVE_SMS   READ_SMS   RECEIVE_WAP_PUSH   RECEIVE_MMS</td>
</tr>
<tr>
<td style="text-align: center">9</td>
<td style="text-align: center">STORAGE (存储卡)</td>
<td style="text-align: center">READ_EXTERNAL_STORAGE    WRITE_EXTERNAL_STORAGE</td>
</tr>
</tbody>
</table>
<pre><code> 另外注意一下,表格中每个危险权限都属于一个权限组,我们在进行运行时权限处理时使用的是权限名,但是用户一旦同意授权了,那么该权限所对应的权限组中所有的其他权限也会同时被授权。
</code></pre>
<p>可以查看Android系统中完整权限:Android权权限</p>
<p>所有权限:</p>
<p>1        ACCESS_CHECKIN_PROPERTIES        允许读写访问”properties”表在checkin数据库中,改值可以修改上传<br>
2        ACCESS_COARSE_LOCATION        允许一个程序访问CellID或 WiFi热点来获取粗略的位置<br>
3        ACCESS_FINE_LOCATION        允许一个程序访问CellID或 WiFi热点来获取粗略的位置<br>
4        ACCESS_LOCATION_EXTRA_COMMANDS        允许应用程序访问额外的位置提供命令<br>
5        ACCESS_NETWORK_STATE        允许程序获取网络信息状态,如当前的网络连接是否有效<br>
6        ACCESS_NOTIFICATION_POLICY        希望访问通知策略的应用程序的标记许可<br>
7        ACCESS_WIFI_STATE        允许程序获取当前WiFi接入的状态以及WLAN热点的信息<br>
8        ACCOUNT_MANAGER        允许程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息<br>
9        ADD_VOICEMAIL        允许一个应用程序添加语音邮件系统<br>
10        BATTERY_STATS        允许程序更新手机电池统计信息<br>
11        BIND_ACCESSIBILITY_SERVICE        请求accessibilityservice服务,以确保只有系统可以绑定到它<br>
12        BIND_APPWIDGET        允许程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限<br>
13        BIND_CARRIER_MESSAGING_SERVICE        API等级高于23时使用,否则使用BIND_CARRIER_SERVICES<br>
14        BIND_CARRIER_SERVICES        允许绑定到运营商应用程序中的服务的系统进程将有这个权限<br>
15        BIND_CHOOSER_TARGET_SERVICE        必须由ChooserTargetService要求,确保只有系统可以绑定到它<br>
16        BIND_DEVICE_ADMIN        请求系统管理员接收者receiver,只有系统才能使用<br>
17        BIND_DREAM_SERVICE        必须由一个DreamService要求,确保只有系统可以绑定到它<br>
18        BIND_INCALL_SERVICE        必须由一个MidiDeviceService要求,确保只有系统可以绑定到它<br>
19        BIND_INPUT_METHOD        请求InputMethodService服务,只有系统才能使用<br>
20        BIND_MIDI_DEVICE_SERVICE        必须由一MidiDeviceService要求,确保只有系统可以绑定到它<br>
21        BIND_NFC_SERVICE        由HostApduServiceOffHostApduService必须确保只有系统可以绑定到它<br>
22        BIND_NOTIFICATION_LISTENER_SERVICE        必须要求由notificationlistenerservice,以确保只有系统可以绑定到它<br>
23        BIND_PRINT_SERVICE        必须要求由printservice,以确保只有系统可以绑定到它<br>
24        BIND_REMOTEVIEWS        必须通过RemoteViewsService服务来请求,只有系统才能用<br>
25        BIND_TELECOM_CONNECTION_SERVICE        必须由ConnectionService要求,确保只有系统可以绑定到它<br>
26        BIND_TEXT_SERVICE        必须要求textservice,以确保只有系统可以绑定到它<br>
27        BIND_TV_INPUT        必须由TvInputService需要确保只有系统可以绑定到它<br>
28        BIND_VOICE_INTERACTION        必须VoiceInteractionService要求,确保只有系统可以绑定到它<br>
29        BIND_VPN_SERVICE        绑定VPN服务必须通过VpnService服务来请求,只有系统才能用<br>
30        BIND_WALLPAPER        必须通过WallpaperService服务来请求,只有系统才能用<br>
31        BLUETOOTH        允许程序连接配对过的蓝牙设备<br>
32        BLUETOOTH_ADMIN        允许程序进行发现和配对新的蓝牙设备<br>
33        BLUETOOTH_PRIVILEGED        允许应用程序配对蓝牙设备,而无需用户交互。这不是第三方应用程序可用<br>
34        BODY_SENSORS        允许应用程序访问用户使用的传感器来测量他/她的身体内发生了什么,如心率仪<br>
35        BROADCAST_PACKAGE_REMOVED        允许程序广播一个提示消息在一个应用程序包已经移除后<br>
36        BROADCAST_SMS        允许程序当收到短信时触发一个广播<br>
37        BROADCAST_STICKY        允许程序收到广播后快速收到下一个广播<br>
38        BROADCAST_WAP_PUSH        WAP PUSH服务收到后触发一个广播<br>
39        CALL_PHONE        允许程序从非系统拨号器里拨打电话<br>
40        CALL_PRIVILEGED        允许程序拨打电话,替换系统的拨号器界面<br>
41        CAMERA        允许程序访问摄像头进行拍照<br>
42        CAPTURE_AUDIO_OUTPUT        允许一个应用程序捕获音频输出。不被第三方应用使用<br>
43        CAPTURE_SECURE_VIDEO_OUTPUT        允许一个应用程序捕获视频输出。不被第三方应用使用<br>
44        CAPTURE_VIDEO_OUTPUT        允许一个应用程序捕获视频输出,不被第三方应用使用<br>
45        CHANGE_COMPONENT_ENABLED_STATE        改变组件是否启用状态<br>
46        CHANGE_CONFIGURATION        允许当前应用改变配置,如定位<br>
47        CHANGE_NETWORK_STATE        允许程序改变网络状态,如是否联网<br>
48        CHANGE_WIFI_MULTICAST_STATE        允许程序改变WiFi多播状态<br>
49        CHANGE_WIFI_STATE        允许程序改变WiFi状态<br>
50        CLEAR_APP_CACHE        允许程序清除应用缓存<br>
51        CONTROL_LOCATION_UPDATES        允许程序获得移动网络定位信息改变<br>
52        DELETE_CACHE_FILES        允许程序删除缓存文件<br>
53        DELETE_PACKAGES        允许程序删除应用<br>
54        DIAGNOSTIC        允许程序到RW到诊断资源<br>
55        DISABLE_KEYGUARD        允许程序禁用键盘锁<br>
56        DUMP        允许程序获取系统dump信息从系统服务<br>
57        EXPAND_STATUS_BAR        允许程序扩展或收缩状态栏<br>
58        FACTORY_TEST        允许程序运行工厂测试模式<br>
59        FLASHLIGHT        允许访问闪光灯<br>
60        GET_ACCOUNTS        允许程序访问账户Gmail列表<br>
61        GET_ACCOUNTS_PRIVILEGED        允许访问帐户服务中的帐户列表<br>
62        GET_PACKAGE_SIZE        允许一个程序获取任何package占用空间容量<br>
63        GET_TASKS        允许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等<br>
64        GLOBAL_SEARCH        允许程序允许全局搜索<br>
65        INSTALL_LOCATION_PROVIDER        允许程序安装定位提供<br>
66        INSTALL_PACKAGES        允许程序安装应用<br>
67        INSTALL_SHORTCUT        创建快捷方式<br>
68        INTERNET        允许程序访问网络连接,可能产生GPRS流量<br>
69        KILL_BACKGROUND_PROCESSES        允许程序调用killBackgroundProcesses(String).方法结束后台进程<br>
70        LOCATION_HARDWARE        允许一个应用程序中使用定位功能的硬件,不使用第三方应用<br>
71        MANAGE_DOCUMENTS        允许一个应用程序来管理文档的访问,通常是一个文档选择器部分<br>
72        MASTER_CLEAR        允许程序执行软格式化,删除系统配置信息<br>
73        MEDIA_CONTENT_CONTROL        允许一个应用程序知道什么是播放和控制其内容。不被第三方应用使用<br>
74        MODIFY_AUDIO_SETTINGS        允许程序修改声音设置信息<br>
75        MODIFY_PHONE_STATE        允许程序修改电话状态,如飞行模式,但不包含替换系统拨号器界面<br>
76        MOUNT_FORMAT_FILESYSTEMS        允许程序格式化可移动文件系统,比如格式化清空SD卡<br>
77        MOUNT_UNMOUNT_FILESYSTEMS        允许程序挂载、反挂载外部文件系统<br>
78        NFC        允许程序执行NFC近距离通讯操作,用于移动支持<br>
79        PACKAGE_USAGE_STATS        允许一个程序设置他的activities显示<br>
80        PERSISTENT_ACTIVITY        允许程序创建一个永久的Activity,该功能标记为将来将被移除<br>
81        PROCESS_OUTGOING_CALLS        允许程序监视,修改或放弃播出电话<br>
82        READ_CALENDAR        允许程序读取用户的日程信息<br>
83        READ_CALL_LOG        读取通话记录<br>
84        READ_CONTACTS        允许程序访问联系人通讯录信息<br>
85        READ_EXTERNAL_STORAGE        程序可以读取设备外部存储空间(内置SDcard和外置SDCard)的文件,如果您的App已经添加了”WRITE_EXTERNAL_STORAGE”权限,则就没必要添加读的权限了,写权限已经包含了读权限了<br>
86        READ_FRAME_BUFFER        允许程序读取帧缓存用于屏幕截图<br>
87        READ_INPUT_STATE        允许程序读取当前键的输入状态,仅用于系统<br>
88        READ_LOGS        允许程序读取系统底层日志<br>
89        READ_PHONE_STATE        允许程序访问电话状态<br>
90        READ_SMS        允许程序读取短信内容<br>
91        READ_SYNC_SETTINGS        允许程序读取同步设置,读取Google在线同步设置<br>
92        READ_SYNC_STATS        允许程序读取同步状态,获得Google在线同步状态<br>
93        READ_VOICEMAIL        允许应用程序在系统读取语音邮件<br>
94        REBOOT        允许程序重新启动设备<br>
95        RECEIVE_BOOT_COMPLETED        允许程序开机自动运行<br>
96        RECEIVE_MMS        允许程序接收彩信<br>
97        RECEIVE_SMS        允许程序接收短信<br>
98        RECEIVE_WAP_PUSH        允许程序接收WAP PUSH信息<br>
99        RECORD_AUDIO        允许程序录制声音通过手机或耳机的麦克<br>
100        REORDER_TASKS        允许程序重新排序系统Z轴运行中的任务<br>
101        REQUEST_IGNORE_BATTERY_OPTIMIZATIONS        权限的应用程序必须要使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS这是一个正常的权限:一个应用程序请求它将永远被授予权限,而不需要用户批准或看到它。<br>
102        REQUEST_INSTALL_PACKAGES        允许应用程序请求安装包。针对API大于22必须持有该许可使用ACTION_INSTALL_PACKAGE应用。<br>
103        RESTART_PACKAGES        允许程序结束任务通过restartPackage(String)方法,该方式将在外来放弃<br>
104        SEND_RESPOND_VIA_MESSAGE        允许用户在来电的时候用你的应用进行即时的短信息回复<br>
105        SEND_SMS        允许程序发送短信<br>
106        SET_ALARM        允许程序设置闹铃提醒<br>
107        SET_ALWAYS_FINISH        允许程序设置程序在后台是否总是退出<br>
108        SET_ANIMATION_SCALE        允许程序设置全局动画缩放<br>
109        SET_DEBUG_APP        允许程序设置调试程序,一般用于开发<br>
110        SET_PREFERRED_APPLICATIONS        允许程序设置应用的参数,已不再工作具体查看addPackageToPreferred(String) 介绍<br>
111        SET_PROCESS_LIMIT        允许程序设置最大的进程数量的限制<br>
112        SET_TIME        允许程序设置系统时间<br>
113        SET_TIME_ZONE        允许程序设置系统时区<br>
114        SET_WALLPAPER        允许程序设置桌面壁纸<br>
115        SET_WALLPAPER_HINTS        允许程序设置壁纸建议<br>
116        SIGNAL_PERSISTENT_PROCESSES        允许程序发送一个永久的进程信号<br>
117        STATUS_BAR        允许程序打开、关闭、禁用状态栏<br>
118        SYSTEM_ALERT_WINDOW        允许程序显示系统窗口<br>
119        TRANSMIT_IR        允许使用设备的红外发射器,如果可用<br>
120        UNINSTALL_SHORTCUT        删除快捷方式<br>
121        UPDATE_DEVICE_STATS        允许程序更新设备状态<br>
122        USE_FINGERPRINT        允许应用程序使用指纹硬件<br>
123        USE_SIP        允许程序使用SIP视频服务<br>
124        VIBRATE        允许程序振动<br>
125        WAKE_LOCK        允许程序在手机屏幕关闭后后台进程仍然运行<br>
126        WRITE_APN_SETTINGS        允许程序写入网络GPRS接入点设置<br>
127        WRITE_CALENDAR        允许程序写入日程,但不可读取<br>
128        WRITE_CALL_LOG        允许程序写入(但是不能读)用户的联系人数据<br>
129        WRITE_CONTACTS        写入联系人,但不可读取<br>
130        WRITE_EXTERNAL_STORAGE        允许程序写入外部存储,如SD卡上写文件<br>
131        WRITE_GSERVICES        允许程序修改Google服务地图<br>
132        WRITE_SECURE_SETTINGS        允许应用程序读取或写入安全系统设置<br>
133        WRITE_SETTINGS        允许程序读取或写入系统设置<br>
134        WRITE_SYNC_SETTINGS        允许程序写入同步设置<br>
135        WRITE_VOICEMAIL        允许应用程序修改和删除系统中的现有的语音邮件,只有系统才能使用</p>
<h1 id="3权限案例">3.权限案例</h1>
<p>拨打电话</p>
<p><code>AndroidManifest.xml</code></p>
<pre><code class="language-xml">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.permissiondemo"&gt;

    &lt;!--拨打电话权限--&gt;
    &lt;uses-permission android:name="android.permission.CALL_PHONE"/&gt;
    ......
&lt;/manifest&gt;

</code></pre>
<pre><code class="language-xml">
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"&gt;

    &lt;Button android:id="@+id/btn_callphone"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="打电话"/&gt;

&lt;/LinearLayout&gt;

</code></pre>
<pre><code class="language-java">public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      Button btn_callphone = findViewById(R.id.btn_callphone);
      btn_callphone.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 {
                  callPhone();
                }
            }
      });
    }

    /**
   * 拨打电话
   * */
    private void callPhone() {
      try {
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);

      } catch (SecurityException e) {
            e.printStackTrace();
      }
    }

    /**
   * 授权回调函数
   * 使用requestCode区别请求
   * */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);

      switch (requestCode) {
            case 1: {
                if (grantResults.length &gt; 0 &amp;&amp; grantResults == PackageManager.PERMISSION_GRANTED){
                  callPhone();
                }else {
                  Toast.makeText(MainActivity.this, "拨打电话权限未授权", Toast.LENGTH_SHORT).show();
                }
            }
            break;
            default:
                break;
      }
    }
}

</code></pre>
<p>其它示例:<br>
https://www.jianshu.com/p/75a1e0b28737</p>
<p>​</p><br><br>
来源:https://www.cnblogs.com/easy5weikai/p/12589198.html
頁: [1]
查看完整版本: 23. Android开发笔记:权限