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