Я хочу добавить функцию предоставления пользователю списка разрешений для утверждения сразу после открытия приложения в первый раз.

Я прочитал эту статью о том, как это сделать.

Но у меня все еще есть вопросы по этому поводу, чтобы сделать эту функцию моего приложения действительно динамичной:

  • Как прочитать из файла манифеста список необходимых разрешений? (Это позволяет избежать явной жестко запрограммированной проверки каждого требуемого разрешения)

  • Как программно классифицировать эти разрешения как НОРМАЛЬНЫЕ и ОПАСНЫЕ , поскольку мне нужно явно спрашивать пользователя только тогда, когда разрешение является опасным добрые? (Согласно документации, обычные разрешения автоматически предоставляются ОС без запроса пользователя)

6
SoulRayder 27 Ноя 2016 в 09:39

4 ответа

Лучший ответ

Вам необходимо проверять каждый раз, когда ваше приложение получает разрешение на погоду, если вы хотите выполнить какую-либо операцию, связанную с этими разрешениями.

Потому что пользователь может отключить это разрешение в настройках в любое время.

Опасные разрешения и группы разрешений:

КАЛЕНДАРЬ

READ_CALENDAR
WRITE_CALENDAR

CALL_LOG

READ_CALL_LOG 
WRITE_CALL_LOG 
PROCESS_OUTGOING_CALLS

КАМЕРА

CAMERA

КОНТАКТЫ

READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS

МЕСТО

ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION

МИКРОФОН

RECORD_AUDIO

ТЕЛЕФОН

READ_PHONE_STATE
READ_PHONE_NUMBERS
CALL_PHONE
ANSWER_PHONE_CALLS
ADD_VOICEMAIL
USE_SIP

ДАТЧИКИ

BODY_SENSORS

SMS

SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS

ХРАНЕНИЕ

READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

Источник Опасные разрешения

Обычные разрешения:

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

Источник Обычные разрешения

Получите список требуемых разрешений программно:

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();
    }
}
8
Community 20 Июн 2020 в 09:12

AFAIK, нет возможности программно прочитать все разрешения из манифеста. Однако, поскольку они уже указаны в манифесте перед выпуском APK, вы уже знаете, какие разрешения нужно запрашивать. Не так ли?

Допустим, у вас есть READ_PHONE_STATE и WRITE_EXTERNAL_STORAGE в вашем манифесте, вы можете добавить это в свою проверку прав доступа в MainActivity.java:

ArrayList<String> arrPerm = new ArrayList<>();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
    arrPerm.add(Manifest.permission.READ_PHONE_STATE);
}
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    arrPerm.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(!arrPerm.isEmpty()) {
    String[] permissions = new String[arrPerm.size()];
    permissions = arrPerm.toArray(permissions);
    ActivityCompat.requestPermissions(this, permissions, MY_PERMISSIONS_REQUEST);
}

Это вызовет запросы разрешений для WRITE_EXTERNAL_STORAGE и READ_PHONE_STATE, один за другим. Чтобы проверить, какие разрешения предоставлены, сделайте следующее:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {

    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0) {
                for(int i = 0; i < grantResults.length; i++) {
                    String permission = permissions[i];
                    if(Manifest.permission.READ_PHONE_STATE.equals(permission)) {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                            // you now have permission
                        }
                    }
                    if(Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permission)) {
                        if(grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                            // you now have permission
                        }
                    }
                }
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            break;
        }
    }

    // other 'case' lines to check for other
    // permissions this app might request
}
2
user1506104 27 Ноя 2016 в 08:06

Разрешения времени выполнения добавляются в Android из Android 6.0 (уровень API 23), до этого разрешения должны определяться только в манифесте. Но в Android 6 и выше вам необходимо получить разрешение на выполнение (опасность) от пользователя прямо перед выполнением задачи.

Из документации, включенной в вопрос

Если вашему приложению требуется опасное разрешение, вы должны проверять, есть ли у вас это разрешение, каждый раз, когда выполняете операцию, требующую этого разрешения.

Поэтому, если вы выполняете задачу, для которой требуется разрешение на опасность, вы должны попросить пользователя принять это, иначе это вызовет исключение времени выполнения.

Вы можете прочитать это, чтобы лучше всего получать разрешения.

0
Bills 27 Ноя 2016 в 06:57

Разрешения, определенные в манифесте с помощью , будут автоматически работать для устройств Android с уровнем API ниже 23. Для устройств выше Android (6.0) вам придется проверять разрешения во время выполнения .

https://developer.android.com/guide/topics/security/permissions. html по этой ссылке есть список опасных разрешений

0
Jay Pandya 27 Ноя 2016 в 07:18