以编程方式向用户请求权限?

Sou*_*der 5 android android-manifest android-permissions

我要添加的功能是,在首次打开应用程序后,为用户提供批准的权限列表。

我从这篇文章中阅读了有关如何执行此操作的信息。

但是我仍然对此有一些疑问,以使我的应用程序的此功能真正动态:

  • 如何从清单文件中读取所需权限列表?(这避免了对每个所需权限的显式硬编码验证)

  • 由于我仅在权限属于危险种类时才需要明确询问用户,因此如何以编程方式将这些权限分类为NORMALDANGEROUS?(根据文档,普通权限由操作系统自动授予,而无需请求用户)

Pri*_*tel 7

要执行与该权限相关的某些操作时,您需要检查每次是否向您的应用授予天气权限。

因为用户可以随时从设置中禁用该权限。

危险权限和权限组:

日历

READ_CALENDAR
WRITE_CALENDAR
Run Code Online (Sandbox Code Playgroud)

通话记录

READ_CALL_LOG 
WRITE_CALL_LOG 
PROCESS_OUTGOING_CALLS
Run Code Online (Sandbox Code Playgroud)

相机

CAMERA
Run Code Online (Sandbox Code Playgroud)

联系方式

READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
Run Code Online (Sandbox Code Playgroud)

地点

ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
Run Code Online (Sandbox Code Playgroud)

麦克风

RECORD_AUDIO
Run Code Online (Sandbox Code Playgroud)

电话

READ_PHONE_STATE
READ_PHONE_NUMBERS
CALL_PHONE
ANSWER_PHONE_CALLS
ADD_VOICEMAIL
USE_SIP
Run Code Online (Sandbox Code Playgroud)

感应器

BODY_SENSORS
Run Code Online (Sandbox Code Playgroud)

短信

SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
Run Code Online (Sandbox Code Playgroud)

存储

READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
Run Code Online (Sandbox Code Playgroud)

危险权限

普通权限:

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
FOREGROUND_SERVICE
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MANAGE_OWN_CALLS
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_COMPANION_RUN_IN_BACKGROUND
REQUEST_COMPANION_USE_DATA_IN_BACKGROUND
REQUEST_DELETE_PACKAGES
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
SET_ALARM
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
Run Code Online (Sandbox Code Playgroud)

普通权限

以编程方式获取所需权限的列表:

public void readPermission()
{
    try {
        PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_PERMISSIONS);
        if (info.requestedPermissions != null) {
            for (String p : info.requestedPermissions) {
                Log.d(TAG, "Permission : " + p);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)