#java #android #android-studio
#java #Android #android-studio
Вопрос:
Начиная с Android 11 у меня возникли проблемы с запросом разрешений на Pixel 3a Xl (после обновления до android11).
Итак, у меня есть этот файл gradle приложения:
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 30
buildToolsVersion '30.0.2'
defaultConfig {
applicationId "nnt.codecexp"
minSdkVersion 23
targetSdkVersion 30
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.preference:preference:1.1.0'
implementation "com.google.android.gms:play-services-maps:17.0.0"
implementation "com.google.android.gms:play-services-location:17.0.0"
}
и код MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
}
@Override
protected void onStart() {
super.onStart();
String[] permissions = {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION
};
requestPermissions(permissions, 0);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
for (int i = 0; i < permissions.length; i ) {
String permission = permissions[i];
boolean isGranted = grantResults[i] >= 0;
Log.d("atf", permission " isGranted: " isGranted);
}
}
}
Я делаю новую установку приложения на свое устройство из Android Studio, и журналы показывают мне, что разрешения автоматически отклоняются без получения запроса на предоставление разрешений. (Окно запроса не отображается). Я понимаю, что на Android 11, если пользователь отклоняет разрешения, например, 2 раза, система пропустит диалоговое окно запроса при следующем запросе разрешений, и они будут автоматически отклонены. Но это не так, проблема возникает сразу после новой установки приложения. (приложение отсутствует на устройстве при запуске из Android Studio)
Однако: если я изменю в файле gradle «targetSdkVersion 30» на «targetSdkVersion 29«, все работает правильно, как и ожидалось.
Кто-нибудь может сказать мне, почему это происходит, и сохраняет ли «targetSdkVersion 29» хорошим решением этой проблемы?
Я делаю что-то не так? или это просто Google [censored] [censored] [censored] .
Ответ №1:
В соответствии с обновлениями местоположения в Android 11:
Как описано в руководстве о том, как запрашивать доступ к местоположению во время выполнения, вы должны выполнять дополнительные запросы местоположения. Если ваше приложение предназначено для Android 11 или выше, система применяет эту передовую практику. Если вы одновременно запрашиваете разрешение на расположение на переднем плане и разрешение на фоновое расположение, система игнорирует запрос и не предоставляет вашему приложению ни одного разрешения.
Вы запрашиваете фоновое местоположение одновременно с запросом разрешения на местоположение. Вам нужно сначала запросить разрешения на местоположение, а затем отдельно запросить ACCESS_BACKGROUND_LOCATION
разрешение.
Ответ №2:
Я решаю проблемы такого типа Android 11 (sdk 30) новое обновление для запроса разрешений одно за другим, а не формат массива
, поэтому попробуйте использовать это в манифесте
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"
android:maxSdkVersion="30"/>
and MainActivty.java
if (ActivityCompat.checkSelfPermission(AutoStartPermissionActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!=
PackageManager.PERMISSION_GRANTED ){
Log.d("LLLLLLLLLLLLLL", "checksecondPermission: " "start One");
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},100);
} else {
checksecondPermission();
Log.d("LLLLLLLLLLLLLL", "checksecondPermission: " "End One");
}
private void checksecondPermission() {
if (ActivityCompat.checkSelfPermission(AutoStartPermissionActivity.this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)!=
PackageManager.PERMISSION_GRANTED ){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION},100);
} else {
Log.d("LLLLLLLLLLLLLL", "Permission Already Allow : " "End One");
}
}
этот код отлично работает при первом открытии приложения, чтобы предоставить простое разрешение на точное местоположение и закрыть приложение, повторно открыть приложение, чтобы во второй раз показать все время с помощью диалогового окна местоположения.[1]
[1]: https://i.stack.imgur.com/UOzSi.jpg