目标SDK版本为30,用户不会被提示授权。

3

从Android 11开始,我在Pixel 3a Xl上请求权限时遇到了问题(升级到Android 11之后)。

因此,我有这个应用程序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”是否是解决此问题的好方法?
我做错了什么吗?还是谷歌 [删除] [删除] [删除]。
2个回答

3
根据Android 11中的位置更新
正如在运行时请求位置访问权限指南中所述,您应该执行增量位置请求。如果您的应用程序针对Android 11或更高版本,则系统会执行此最佳实践。如果您同时请求前台位置权限和后台位置权限,则系统会忽略该请求并不授予您的应用程序任何权限。
您正在同时请求位置权限和后台位置权限。您需要首先请求位置权限,然后单独请求ACCESS_BACKGROUND_LOCATION权限。

0

我解决了这种类型的问题 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]: https://istack.dev59.com/UOzSi.webp

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