Android权限:我该如何了解哪些是危险的权限,哪些是正常的权限?

11
Android定义了一组第三方应用可以请求的权限。权限按敏感性分类;大多数权限要么是“普通”权限,要么是“危险”权限。普通权限会自动授权,无需提示用户;安装应用程序时会向用户呈现危险权限,并要求用户同意授权。
问题:针对我想到的任何特定Android权限,我如何判断它是普通权限还是危险权限?是否有危险权限列表和普通权限列表?
(我知道第三方应用程序可以声明自己的权限。我只问标准权限。我知道可能无法获得100%完整的列表。我只寻求最佳努力;有些总比没有。)
对于一个相关但不同的问题,请参见我在哪里可以获取Android权限列表(但这是一个不同的问题;它并没有区分普通和危险权限,我不一定需要完整的列表)。
7个回答

23

为了更简单,以下是从官方文档中列出的普通权限列表:

自API 23级起,以下权限被归类为PROTECTION_NORMAL:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
FLASHLIGHT
GET_PACKAGE_SIZE
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
SET_ALARM
INSTALL_SHORTCUT
UNINSTALL_SHORTCUT

以下是危险权限和权限组列表:

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

15

正常权限会自动授权,不需要提示用户

据我所知,这里的文档是错误的。

危险权限在应用程序安装时向用户呈现,并要求用户同意授予它们

据我所知,所有权限都有这个行为。

可能演变成的是:危险权限总是显示,而普通权限可能会“被折叠”如果有足够多的危险权限的话。

对于我想知道的任何特定Android权限,我如何确定它是普通权限还是危险权限?是否有危险权限列表和普通权限列表?

您可以查看源代码


1
链接已损坏,请尝试使用此链接:https://github.com/android/platform_frameworks_base/blob/master/core/res/AndroidManifest.xml - Ben Holland
我认为上述描述中应该解释一个不同之处。危险权限在运行时授予,并在API级别23中引入。 - Satish
这个答案并不是非常令人满意,只是告诉了它们之间的区别;我相信提问者想要危险权限列表! - DJphy
1
@DJphy:每个Android版本的“危险”权限列表都会发生变化。 - CommonsWare
@CommonsWare,看看我,我真是太蠢了。我没有想到这一点。这是非常正确的;感谢您的启示,对不起! - DJphy

6
我发现了this这篇博客文章,列出了按保护级别分类的“默认”权限。我认为,这就是你在寻找的列表类型。
然而,由于该帖子已经有10个月的时间,列表可能已经发生了变化。它提供了示例代码,可以重新编译列表。

3

这里 有一篇很好的文章,描述了关于运行时权限的所有内容,

普通权限

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT

危险权限 enter image description here

3

1
在Android Studio中,您可以打开AndroidManifest.xml文件并在使用每个权限时按F1键,然后您可以查看文档中是否标记为危险。

1

随着新的Android版本发布,会添加新的权限,因此您代码中包含的任何列表都会过时。

如果您需要一种具有未来保障的方法,可以在运行时确定权限是否具有危险性。

fun Context.isDangerousPermission(permissionName: String): Boolean {
    val permissionInfo: PermissionInfo = try {
        packageManager.getPermissionInfo(permissionName, 0);
    } catch (ex: PackageManager.NameNotFoundException) {
        return false
    }
    return if (Build.VERSION.SDK_INT >= 28) {
        permissionInfo.protection == PermissionInfo.PROTECTION_DANGEROUS
    } else {
        permissionInfo.protectionLevel and PermissionInfo.PROTECTION_DANGEROUS != 0
    }
}

这个扩展函数返回true,如果一个权限是危险的。

例如:

activity.isDangerousPermission("android.permission.CAMERA") // true
activity.isDangerousPermission("android.permission.INTERNET") // false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接