前言
uses-permission和permission的区别
permission定义权限
uses-permission申请权限
uses-permission(权限申请)
介绍
Android 应用必须请求访问敏感用户数据(例如联系人和短信)或某些系统功能(例如相机和互联网访问)的权限。每个权限都由一个唯一的标签标识。例如,需要发送 SMS 消息和访问互联网的应用程序必须在清单中包含以下内容:
<manifest ... >
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
添加自定义权限,如:
<manifest ... >
<uses-permission android:name="com.scc.userprovider.permissionread"/>
<uses-permission android:name="com.scc.userprovider.permissionwrite"/>
...
</manifest>
权限不仅用于请求系统功能。你还可以限制其他应用与你的应用组件交互的方式。如何自定义权限请往下看。
官方权限大全
或者去文章最后查看
permission(自定义权限)
介绍
你的应用可以使用 声明安全权限,可用于限制对此应用或其他应用的特定组件或功能的访问,例如 ContentProvider。
<permission
android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permissionGroup="string"
android:protectionLevel=["normal" | "dangerous" |
"signature" | ...] />
android:description:权限说明。此属性必须设置为对字符串资源的引用。
例如:
<permission
android:description="哈哈可读说明"
.../>
报错:AAPT: error: '哈哈可读说明' is incompatible with attribute description (attr) reference.
-
android:icon:权限的图标。
-
android:label:向用户显示的权限的名称。可将此标签直接设置为原始字符串。不过,当准备好发布应用时,应将标签设置为对字符串资源的引用,以便可以像界面中的其他字符串一样进行本地化。
-
android:name:用于引用权限的名称。(例如,在元素和应用组件的 permission 属性中)
-
android:permissionGroup:将此权限分配给一个组。如果未设置此属性,则此权限不会属于某个组。
-
android:protectionLevel: 说明权限中隐含的潜在风险,并指示系统在确定是否将权限授予请求授权的应用时应遵循的流程。下表列出了所有基本权限类型。
-
normal:默认值。具有较低风险的权限。系统会自动向在安装时请求授权的应用授予此类权限,无需征得用户的明确许可(但用户始终可以选择在安装之前查看这些权限)。
-
dangerous:具有较高风险的权限。由于此类权限会带来潜在风险,因此系统可能不会自动向请求授权的应用授予此类权限。
-
signature 只有在请求授权的应用使用与声明权限的应用相同的证书进行签名时系统才会授予的权限。如果证书匹配,则系统会在不通知用户或征得用户明确许可的情况下自动授予权限。
-
signatureOrSystem:不要使用此选项,因为 signature 保护级别应足以满足大多数需求,无论应用安装在何处,该保护级别都能正常发挥作用。signatureOrSystem权限适用于以下特殊情况:多个供应商将应用内置到一个系统映像中,并且需要明确共享特定功能,因为这些功能是一起构建的。
-
permission样例
应用Demo(com.scc.cp)和其他应用(com.scc.ha)
1.先使用定义一个权限
<permission android:description="@string/permission_description"
android:icon="@mipmap/ic_launcher"
android:label="permissionLabel"
android:name="com.scc.userprovider.permission"
android:protectionLevel="normal"/>
2.provider组件设置权限
<provider
android:authorities="com.scc.userprovider"
android:name="com.scc.cp.UserProvider"
android:permission="com.scc.userprovider.permission"
android:exported="true"/>
3.其他应用(com.scc.ha)使用com.scc.cp包加权限的UserProvider
啥也不做直接操作:
Process: com.scc.ha, PID: 14922
java.lang.SecurityException: Permission Denial: opening provider com.scc.cp.UserProvider from
ProcessRecord{5d7db58 14922:com.scc.ha/u0a889} (pid=14922, uid=10889)
requires com.scc.userprovider.permission or com.scc.userprovider.permission
报错显示缺少com.scc.userprovider.permission权限
缺少权限,咱就申请权限:
<uses-permission android:name="com.scc.userprovider.permission"/>
然后就可以美滋滋的使用com.scc.cp包中的provider数据了。
permission官方文档
permission-group(自定义权限组)
介绍
<permission-group
android:description="string resource"
android:icon="drawable resource"
android:label="string resource"
android:name="string" />
声明相关权限的逻辑分组的名称。各个权限通过 元素的 permissionGroup 属性加入权限组中。权限组中的成员一起显示在界面中。
注意:此元素并不声明权限本身,而只声明可以放置权限的类别。
permission-group属性介绍跟permission类似,就不多做介绍了。
permission-group样例
应用Demo(com.scc.cp)和其他应用(com.scc.ha)
1.先使用定义一个权限组
<permission-group
android:name="com.scc.userprovider.permissiongroup"
android:description="@string/userprovider_permission_group_description"
android:icon="@mipmap/ic_launcher"
android:label="GroupLabel"/>
2.添加组员
<permission
android:name="com.scc.userprovider.permissionread"
android:description="@string/userprovider_permission_read_description"
android:icon="@mipmap/ic_launcher"
android:label="readLabel"
android:permissionGroup="com.scc.userprovider.permissiongroup"
android:protectionLevel="normal"/>
<permission
android:name="com.scc.userprovider.permissionwrite"
android:description="@string/userprovider_permission_write_description"
android:icon="@mipmap/ic_launcher"
android:label="writeLabel"
android:permissionGroup="com.scc.userprovider.permissiongroup"
android:protectionLevel="normal"/>
3.provider组件设置权限
<provider
android:authorities="com.scc.userprovider"
android:name="com.scc.cp.UserProvider"
android:writePermission="com.scc.userprovider.permissionwrite"
android:readPermission="com.scc.userprovider.permissionread"
android:exported="true"/>
4.其他应用(com.scc.ha)使用com.scc.cp包加权限的UserProvider
啥也不做直接操作同样会报上面缺少权限的错误。
咱们先申请权限
<uses-permission android:name="com.scc.userprovider.permissionread"/>
<uses-permission android:name="com.scc.userprovider.permissionwrite"/>
然后就可以美滋滋的使用com.scc.cp包中的provider数据了。
permission-group官方文档
齐活,哪里有问题,欢迎指导。
Android权限大全
ACCEPT_HANDOVER:允许呼叫应用程序继续在另一个应用程序中发起的呼叫。
ACCESS_BACKGROUND_LOCATION:允许应用在后台访问位置。
ACCESS_BLOBS_ACROSS_USERS:允许应用程序跨用户访问数据 blob。API 31新增
ACCESS_CHECKIN_PROPERTIES:允许对签入数据库中的“属性”表进行读/写访问,以更改上传的值。
ACCESS_COARSE_LOCATION:允许应用访问大致位置。
ACCESS_FINE_LOCATION:允许应用访问精确位置。
ACCESS_LOCATION_EXTRA_COMMANDS:允许应用程序访问额外的位置提供程序命令。
ACCESS_MEDIA_LOCATION:允许应用程序访问保存在用户共享集合中的任何地理位置。
ACCESS_NETWORK_STATE:允许应用程序访问有关网络的信息。
ACCESS_NOTIFICATION_POLICY:希望访问通知策略的应用程序的标记权限。
ACCESS_WIFI_STATE:允许应用程序访问有关 Wi-Fi 网络的信息。
ACCOUNT_MANAGER:允许应用程序调用 AccountAuthenticators。
ACTIVITY_RECOGNITION:允许应用程序识别身体活动。
ADD_VOICEMAIL:允许应用程序将语音邮件添加到系统中。
ANSWER_PHONE_CALLS:允许应用接听来电。
BATTERY_STATS:允许应用程序收集电池统计信息
保护级别:signature|privileged|development
BIND_ACCESSIBILITY_SERVICE:必须是AccessibilityService, 以确保只有系统可以绑定到它。
BIND_APPWIDGET:允许应用程序告诉 AppWidget 服务哪个应用程序可以访问 AppWidget 的数据。
BIND_AUTOFILL_SERVICE:必须是AutofillService, 以确保只有系统可以绑定到它。
BIND_CALL_REDIRECTION_SERVICE:必须是CallRedirectionService, 以确保只有系统可以绑定到它。
BIND_CARRIER_MESSAGING_CLIENT_SERVICE:CarrierMessagingClientService必须使用此权限保护 的子类。
BIND_CARRIER_SERVICES:允许绑定到运营商应用中的服务的系统进程将拥有此权限。
BIND_CHOOSER_TARGET_SERVICE:此常量在 API 级别 30 中已弃用。可以使用Sharing Shortcuts API。
BIND_COMPANION_DEVICE_SERVICE:必须由任何CompanionDeviceServices要求 以确保只有系统可以绑定到它。API 31新增
BIND_CONDITION_PROVIDER_SERVICE:必须是ConditionProviderService, 以确保只有系统可以绑定到它。
BIND_CONTROLS:允许 SystemUI 请求第三方控件。
BIND_DEVICE_ADMIN:必须由设备管理接收器要求,以确保只有系统可以与其交互。
BIND_DREAM_SERVICE:必须是DreamService, 以确保只有系统可以绑定到它。
BIND_INCALL_SERVICE:必须是InCallService, 以确保只有系统可以绑定到它。
BIND_INPUT_METHOD:必须是InputMethodService, 以确保只有系统可以绑定到它。
BIND_MIDI_DEVICE_SERVICE:必须是MidiDeviceService, 以确保只有系统可以绑定到它。
BIND_NFC_SERVICE:必须由HostApduService 或要求OffHostApduService以确保只有系统可以绑定到它。
BIND_NOTIFICATION_LISTENER_SERVICE:必须是NotificationListenerService, 以确保只有系统可以绑定到它。
BIND_PRINT_SERVICE:必须是PrintService, 以确保只有系统可以绑定到它。
BIND_QUICK_ACCESS_WALLET_SERVICE:必须由 a 要求QuickAccessWalletService 以确保只有系统可以绑定到它。
BIND_QUICK_SETTINGS_TILE:允许应用程序绑定到第三方快速设置磁贴。
BIND_REMOTEVIEWS:必须是RemoteViewsService, 以确保只有系统可以绑定到它。
BIND_SCREENING_SERVICE:必须是CallScreeningService, 以确保只有系统可以绑定到它。
BIND_TELECOM_CONNECTION_SERVICE:必须是ConnectionService, 以确保只有系统可以绑定到它。
BIND_TEXT_SERVICE:必须由 TextService(例如 SpellCheckerService)要求以确保只有系统可以绑定到它。
BIND_TV_INPUT:必须由要求TvInputService要求以确保只有系统可以绑定到它。
BIND_VISUAL_VOICEMAIL_SERVICE:必须由链接要求VisualVoicemailService以确保只有系统可以绑定到它。
BIND_VOICE_INTERACTION:必须是VoiceInteractionService, 以确保只有系统可以绑定到它。
BIND_VPN_SERVICE:必须是VpnService, 以确保只有系统可以绑定到它。
BIND_VR_LISTENER_SERVICE:必须是VrListenerService, 以确保只有系统可以绑定到它。
BIND_WALLPAPER:必须是WallpaperService, 以确保只有系统可以绑定到它。
BLUETOOTH:允许应用程序连接到配对的蓝牙设备。
BLUETOOTH_ADMIN:允许应用程序发现和配对蓝牙设备。
BLUETOOTH_ADVERTISE:需要能够向附近的蓝牙设备做广告。API 31新增
BLUETOOTH_CONNECT:需要能够连接到配对的蓝牙设备。API 31新增
BLUETOOTH_PRIVILEGED:允许应用程序在没有用户交互的情况下配对蓝牙设备,并允许或禁止电话簿访问或消息访问。
BLUETOOTH_SCAN:需要能够发现和配对附近的蓝牙设备。API 31新增
BODY_SENSORS:允许应用程序访问来自传感器的数据,用户使用这些数据来测量他们体内发生的事情,例如心率。
BROADCAST_PACKAGE_REMOVED:允许应用程序广播应用程序包已被删除的通知。
BROADCAST_SMS:允许应用程序广播 SMS 接收通知。
BROADCAST_STICKY:允许应用程序广播粘性意图。
BROADCAST_WAP_PUSH:允许应用程序广播 WAP PUSH 接收通知。
CALL_COMPANION_APP:允许实现InCallServiceAPI的应用 有资格作为调用配套应用启用。
CALL_PHONE:允许应用程序在不通过拨号器用户界面的情况下发起电话呼叫,以便用户确认呼叫。
CALL_PRIVILEGED:允许应用程序拨打任何电话号码,包括紧急号码,而无需通过拨号器用户界面让用户确认正在拨打的电话。
CAMERA:需要能够访问相机设备。
CAPTURE_AUDIO_OUTPUT:允许应用程序捕获音频输出。
CHANGE_COMPONENT_ENABLED_STATE:允许应用程序更改是否启用应用程序组件(除了它自己的组件)。
CHANGE_CONFIGURATION:允许应用程序修改当前配置,例如语言环境。
CHANGE_NETWORK_STATE:允许应用程序更改网络连接状态。
CHANGE_WIFI_MULTICAST_STATE:允许应用程序进入 Wi-Fi 多播模式。
CHANGE_WIFI_STATE:允许应用程序更改 Wi-Fi 连接状态。
CLEAR_APP_CACHE:允许应用程序清除设备上所有已安装应用程序的缓存。
CONTROL_LOCATION_UPDATES:允许启用/禁用来自无线电的位置更新通知。
DELETE_CACHE_FILES:删除应用程序缓存文件的旧权限,不再使用,但信号让我们悄悄地忽略调用而不是抛出异常。
DELETE_PACKAGES:允许应用程序删除包。
DIAGNOSTIC:允许应用程序读写诊断资源。
DISABLE_KEYGUARD:允许应用程序在不安全的情况下禁用键盘锁。
DUMP:允许应用程序从系统服务中检索状态转储信息。
EXPAND_STATUS_BAR:允许应用程序展开或折叠状态栏。
FACTORY_TEST:作为制造商测试应用程序运行,以 root 用户身份运行。
FOREGROUND_SERVICE:允许常规应用程序使用Service.startForeground.
GET_ACCOUNTS:允许访问帐户服务中的帐户列表。
GET_ACCOUNTS_PRIVILEGED:允许访问帐户服务中的帐户列表。
GET_PACKAGE_SIZE:允许应用程序找出任何包使用的空间。
GLOBAL_SEARCH:此权限可用于内容提供商以允许全球搜索系统访问他们的数据。
HIDE_OVERLAY_WINDOWS:允许应用防止在其上绘制非系统覆盖窗口。API 31新增
HIGH_SAMPLING_RATE_SENSORS:允许应用以大于 200 Hz 的采样率访问传感器数据。API 31新增
INSTALL_LOCATION_PROVIDER:允许应用程序将位置提供程序安装到位置管理器中。
INSTALL_PACKAGES:允许应用程序安装包。
INSTALL_SHORTCUT:允许应用程序在 Launcher 中安装快捷方式。
INSTANT_APP_FOREGROUND_SERVICE:允许免安装应用创建前台服务。
INTERACT_ACROSS_PROFILES:允许在同一配置文件组中的配置文件之间进行交互。
INTERNET:允许应用程序打开网络套接字。
KILL_BACKGROUND_PROCESSES:允许应用程序调用 ActivityManager.killBackgroundProcesses(String).
LOADER_USAGE_STATS:允许数据加载器读取包的访问日志。
LOCATION_HARDWARE:允许应用程序使用硬件中的位置功能,例如地理围栏 api。
MANAGE_DOCUMENTS:允许应用程序管理对文档的访问,通常作为文档选择器的一部分。
MANAGE_EXTERNAL_STORAGE:允许应用程序广泛访问范围存储中的外部存储。
MANAGE_MEDIA:允许应用程序在未经用户确认的情况下修改和删除此设备或任何连接的存储设备上的媒体文件。API 31新增
MANAGE_ONGOING_CALLS:允许查询正在进行的呼叫详细信息并管理正在进行的呼叫。API 31新增。权限等级:signature|appop
MANAGE_OWN_CALLS:允许调用应用程序通过自我管理的ConnectionServiceAPI管理自己的调用 。
MASTER_CLEAR:不供第三方应用程序使用。
MEDIA_CONTENT_CONTROL:允许应用程序了解正在播放的内容并控制其播放。
MODIFY_AUDIO_SETTINGS:允许应用程序修改全局音频设置。
MODIFY_PHONE_STATE:允许修改电话状态 - 开机、mmi 等。
MOUNT_FORMAT_FILESYSTEMS:允许格式化可移动存储的文件系统。
MOUNT_UNMOUNT_FILESYSTEMS:允许为可移动存储安装和卸载文件系统。
NFC:允许应用程序通过 NFC 执行 I/O 操作。
NFC_PREFERRED_PAYMENT_INFO:允许应用程序接收 NFC 首选支付服务信息。
NFC_TRANSACTION_EVENT:允许应用程序接收 NFC 交易事件。
PACKAGE_USAGE_STATS:允许应用程序收集组件使用统计信息
声明权限意味着使用 API 的意图,设备用户可以通过设置应用程序授予权限。
PROCESS_OUTGOING_CALLS:此常量在 API 级别 29 中已弃用。应用程序应使用CallRedirectionService而不是Intent.ACTION_NEW_OUTGOING_CALL广播。
QUERY_ALL_PACKAGES:允许查询设备上的任何普通应用程序,无论清单声明如何。
READ_CALENDAR:允许应用程序读取用户的日历数据。
READ_CALL_LOG:允许应用程序读取用户的通话记录。
READ_CONTACTS:允许应用程序读取用户的联系人数据。
READ_EXTERNAL_STORAGE:允许应用程序从外部存储读取。
READ_LOGS:允许应用程序读取低级系统日志文件。
READ_PHONE_NUMBERS:允许读取设备的电话号码。
READ_PHONE_STATE:允许只读访问电话状态,包括当前的蜂窝网络信息、任何正在进行的呼叫的状态以及PhoneAccount设备上注册的任何s的列表。
READ_PRECISE_PHONE_STATE:允许只读访问精确的手机状态。
READ_SMS:允许应用程序读取 SMS 消息。
READ_SYNC_SETTINGS:允许应用程序读取同步设置。
READ_SYNC_STATS:允许应用程序读取同步统计信息。
READ_VOICEMAIL:允许应用程序读取系统中的语音邮件。
REBOOT:需要能够重新启动设备。
RECEIVE_BOOT_COMPLETED:允许应用程序Intent.ACTION_BOOT_COMPLETED在系统完成启动后接收 广播。
RECEIVE_MMS:允许应用程序监视传入的 MMS 消息。
RECEIVE_SMS:允许应用程序接收 SMS 消息。
RECEIVE_WAP_PUSH:允许应用程序接收 WAP 推送消息。
RECORD_AUDIO:允许应用程序录制音频。
REORDER_TASKS:允许应用程序更改任务的 Z 顺序。
REQUEST_COMPANION_PROFILE_WATCH:允许应用请求通过CompanionDeviceManager 作为“手表” 与设备关联。API 31新增。权限等级:normal
REQUEST_COMPANION_RUN_IN_BACKGROUND:允许配套应用在后台运行。
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND:允许配套应用从后台启动前台服务。API 31新增
REQUEST_COMPANION_USE_DATA_IN_BACKGROUND:允许配套应用在后台使用数据。
REQUEST_DELETE_PACKAGES:允许应用程序请求删除包。
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS:应用程序必须拥有权限才能使用 Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS.
REQUEST_INSTALL_PACKAGES:允许应用程序请求安装包。
REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE:允许应用程序订阅有关其相关配套设备的在线状态更改的通知。API 31新增
REQUEST_PASSWORD_COMPLEXITY:允许应用程序请求屏幕锁定复杂度并提示用户将屏幕锁定更新到一定的复杂度级别。
SCHEDULE_EXACT_ALARM:允许应用程序使用精确的警报 API。API 31新增
SEND_RESPOND_VIA_MESSAGE:允许应用程序(电话)向其他应用程序发送请求,以在传入呼叫期间处理通过消息响应操作。
SEND_SMS:允许应用程序发送 SMS 消息。
SET_ALARM:允许应用程序广播 Intent 为用户设置警报。
SET_ALWAYS_FINISH:允许应用程序控制将活动置于后台时是否立即完成。
SET_ANIMATION_SCALE 修改全局动画缩放因子。
SET_DEBUG_APP 配置用于调试的应用程序。
SET_PROCESS_LIMIT:允许应用程序设置可以运行的(不需要的)应用程序进程的最大数量。
SET_TIME:允许应用程序直接设置系统时间。
SET_TIME_ZONE:允许应用程序直接设置系统时区。
SET_WALLPAPER:允许应用程序设置壁纸。
SET_WALLPAPER_HINTS:允许应用程序设置壁纸提示。
SIGNAL_PERSISTENT_PROCESSES:允许应用程序请求将信号发送到所有持久进程。
SMS_FINANCIAL_TRANSACTIONS:此常量在 API 级别 31 中已弃用。使用此权限的 API 不再起作用。
START_FOREGROUND_SERVICES_FROM_BACKGROUND:允许应用程序随时从后台启动前台服务。
START_VIEW_PERMISSION_USAGE:允许持有者启动应用程序的权限使用屏幕。
STATUS_BAR:允许应用程序打开、关闭或禁用状态栏及其图标。
SYSTEM_ALERT_WINDOW:允许应用程序使用WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY显示在所有其他应用程序顶部的类型创建窗口 。
TRANSMIT_IR:允许使用设备的红外发射器(如果可用)。
UNINSTALL_SHORTCUT 不要在您的应用中使用此权限。
UPDATE_DEVICE_STATS:允许应用程序更新设备统计信息。
UPDATE_PACKAGES_WITHOUT_USER_ACTION:允许应用程序通过PackageInstaller.SessionParams.setRequireUserAction(int) 应用程序更新不需要用户操作来指示 。API 31新增
USE_BIOMETRIC:允许应用使用设备支持的生物识别方式。
USE_FINGERPRINT:此常量在 API 级别 28 中已弃用。应用程序应改为请求USE_BIOMETRIC
USE_FULL_SCREEN_INTENT:对于Build.VERSION_CODES.Q要使用 notification full screen intents.
USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER:允许读取设备标识符并使用基于 ICC 的身份验证,如 EAP-AKA。API 31新增。权限等级: signature|appop
USE_SIP:允许应用程序使用 SIP 服务。
UWB_RANGING:需要能够覆盖使用超宽带的设备。API 31新增。权限等级: dangerous
VIBRATE:允许访问振动器。
WAKE_LOCK:允许使用 PowerManager WakeLocks 来防止处理器休眠或屏幕变暗。
WRITE_APN_SETTINGS:允许应用程序编写 apn 设置并读取现有 apn 设置的敏感字段,如用户和密码。
WRITE_CALENDAR:允许应用程序写入用户的日历数据。
WRITE_CALL_LOG:允许应用程序写入(但不能读取)用户的通话记录数据。
WRITE_CONTACTS:允许应用程序写入用户的联系人数据。
WRITE_EXTERNAL_STORAGE:允许应用程序写入外部存储。
WRITE_GSERVICES:允许应用程序修改 Google 服务地图。
WRITE_SECURE_SETTINGS:允许应用程序读取或写入安全系统设置。
WRITE_SETTINGS:允许应用程序读取或写入系统设置。
WRITE_SYNC_SETTINGS:允许应用程序写入同步设置。
WRITE_VOICEMAIL:允许应用程序修改和删除系统中现有的语音邮件。