微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android - 奇怪的额外权限对话框出现在 Galaxy TAB S7 Android 11 上

如何解决Android - 奇怪的额外权限对话框出现在 Galaxy TAB S7 Android 11 上

我已经测试了我们的应用程序——它在 galaxy S21、Pixel 5、Pixel 1 和 galaxy TAB S7 上请求后台 GPS 许可——只有在 TAB S7 上我才会得到一个额外的弹出许可对话框,其中包含重复的选择和我们的应用程序任何选择后总是在 Android 内部崩溃。请参阅对话框的附图。

有没有其他人看到过这个奇怪的权限对话框并知道如何防止它出现和/或崩溃?

我们的应用请求此权限

Manifest.permission.ACCESS_BACKGROUND_LOCATION

和之前的状态一样 - 在除 galaxy TAB S7 (Android 11) 之外的所有移动设备上都能完美运行。

崩溃跟踪 -

进程:com.google.android.permissioncontroller,PID:17409 java.lang.NullPointerException:尝试从空数组读取 在 com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.logGrantPermissionActivityButtons(GrantPermissionsActivity.java:1283) 在 com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.onPermissionGrantResult(GrantPermissionsActivity.java:1039) 在 com.android.permissioncontroller.permission.ui.handheld.GrantPermissionsViewHandlerImpl.onClick(GrantPermissionsViewHandlerImpl.java:300) 在 android.view.View.performClick(View.java:8160) 在 android.widget.TextView.performClick(TextView.java:16220) 在 android.view.View.performClickInternal(View.java:8137) 在 android.view.View.access$3700(View.java:888) 在 android.view.View$PerformClick.run(View.java:30236) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:246) 在 android.app.ActivityThread.main(ActivityThread.java:8512) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:596) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

enter image description here

代码示例 - 使用旧 API 请求权限 Code available on GitHub

public class MainActivity extends AppCompatActivity
        implements ActivityCompat.OnRequestPermissionsResultCallback,View.OnClickListener {

    private static final int REQUEST_GPS = 0;
    private static final int REQUEST_BG_LOC = 1;
    private static String[] PERMISSIONS_GPS =
            {Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION};
    private static String[] PERMISSIONS_GPS_BG =
            {Manifest.permission.ACCESS_BACKGROUND_LOCATION };
    private View mLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLayout = findViewById(R.id.sample_main_layout);
        mLayout.findViewById(R.id.get_gps_permission).setonClickListener(this);
        mLayout.findViewById(R.id.get_bg_permission).setonClickListener(this);
    }

    public void getGpsPermission() {
        if (hasPerm( PERMISSIONS_GPS[0])) {
            showGotGpsPermission();
        } else {
            ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_GPS,REQUEST_GPS);
        }
    }

    public void getBgLocationPermission() {
        if (hasPerm(PERMISSIONS_GPS_BG)) {
            showGotBgLocPermission();
        } else {
            ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_GPS_BG,REQUEST_BG_LOC);
        }
    }

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

        boolean gotPerm = true;
        for (int idx = 0; idx < grantResults.length; idx++) {
            if (grantResults[idx] != PackageManager.PERMISSION_GRANTED) {
                Snackbar.make(mLayout,permissions[idx] + " not granted",Snackbar.LENGTH_SHORT)
                        .show();
                gotPerm = false;
            }
        }

        switch (requestCode) {
            case REQUEST_GPS:
                if (gotPerm) showGotGpsPermission();
                break;
            case REQUEST_BG_LOC:
                if (gotPerm) showGotBgLocPermission();
                break;
            default:
                super.onRequestPermissionsResult(requestCode,permissions,grantResults);
                break;
        }
    }

    private boolean hasPerm(String ... permissions) {
        for (String perm : permissions) {
            if (ActivityCompat.checkSelfPermission(this,perm)
                    != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    private void showGotGpsPermission() {
        TextView tv = mLayout.findViewById(R.id.status_gps_permission);
        tv.setText(R.string.gps_permission_granted);
    }
    private void showGotBgLocPermission() {
        TextView tv = mLayout.findViewById(R.id.status_bg_permission);
        tv.setText(R.string.background_permission_granted);
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        if (id == R.id.get_gps_permission) {
            getGpsPermission();
        } else if (id == R.id.get_bg_permission) {
            getBgLocationPermission();
        }
    }
}

Cause of issue - Don't keep activities

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。