Настройки разрешений для приложений Android

#android #samsung-galaxy

#Android #samsung-galaxy

Вопрос:

Мое внутреннее приложение для Android отлично работало на Samsung Tab S2 и автоматически получало разрешения на доступ к «хранилищу» и «местоположению» устройства. Но, когда я устанавливаю приложение на более новый Samsung Galaxy Tab S7, я должен вручную предоставить разрешение для приложения в настройках. По умолчанию для него установлено значение «Разрешения не разрешены», как я могу это автоматизировать. AndroidManifest.xml имеет следующие настройки

   <uses-sdk
        android:minSdkVersion="21"
        android:targetSdkVersion="22"/>

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
 

Комментарии:

1. developer.android.com/training/permissions/requesting

2. @Michael спасибо, что объясняет, почему он работал на более старой версии, в которой был Android 5.2, но на этих Android 9

3. уменьшите целевую версию, тогда она не будет

Ответ №1:

Разрешения для Android претерпели радикальные изменения после M выхода Android. до этого разработчики могут просто заблокировать все разрешения в AndroidManifesto файле, и прежде чем пользователь установит приложение, он / она должен утвердить все разрешения для запуска приложения.

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

Ответ №2:

Вы должны предоставить разрешение от пользователя. Вы можете использовать его внутри фрагмента:

Java:

 if (ActivityCompat.checkSelfPermission(getContext(),
        android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) != PackageManager.PERMISSION_GRANTED) {
     requestPermissions(getActivity(),
            new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
            REQUEST_LOCATION);
} else {
    Log.e("DB", "PERMISSION GRANTED");
}
 

Kotlin:

 if (ActivityCompat.checkSelfPermission(getContext(),
                    Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(getActivity(), arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                REQUEST_LOCATION)
    } else {
        Log.e("DB", "PERMISSION GRANTED")
    }
 

и внутренняя активность:

Java:

 int checkPermission= ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA);
if (checkPermission!= PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions((Activity)getContext(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);
}
else {
    Log.e("DB", "PERMISSION GRANTED")
}
 

Kotlin:

     val checkPermission = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA)
if (checkPermission != PackageManager.PERMISSION_GRANTED)
{
  ActivityCompat.requestPermissions(getContext() as Activity, arrayOf<String>(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION)
}
else
{
  Log.e("DB", "PERMISSION GRANTED")
}