向 Android 13 请求叠加和发布通知权限

问题描述 投票:0回答:1

我将对旧应用程序的支持扩展到 Android 13,并且我看到了很多变化。 首先,我注意到

startActivityForResult
已被弃用,因为 Google 决定更改处理权限请求和结果的方式。

这里有几个例子: OnActivityResult 方法已被弃用,有什么替代方法?但说实话,我确实很清楚新方法是如何工作的。 只知道似乎使用了观察者模式。

这就是我目前请求覆盖权限的方式:

   private void askForSystemOverlayPermission() {
        if (!Settings.canDrawOverlays(this)) {
            //If the draw over permission is not available open the settings screen
            //to grant the permission.
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, DRAW_OVER_OTHER_APP_PERMISSION_REQUEST_CODE);
        }
    }

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == DRAW_OVER_OTHER_APP_PERMISSION_REQUEST_CODE) {
            if (!Settings.canDrawOverlays(this)) {
                //Permission is not available. Display error text.
                errorToastDrawOverOtherApp();
                finish();
            }
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

有人可以帮我吗?

我还注意到,现在 Google 还需要获得发布通知的权限。 我已经在清单文件中添加了权限,但我仍然需要帮助来处理请求权限。 在我的服务中,我得到以下红色行(问题):

this.notificationManager.notify(notificationID, notification);

因为:

调用需要权限,可能会被用户拒绝:代码应该 显式检查权限是否可用(使用 checkPermission)或显式处理潜在的 SecurityException

这是 IDE 建议的修复:

 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }

这是否意味着我每次发送通知时都需要检查权限,或者这只是因为我没有在主要活动中或启动服务时检查/请求权限而出现?

java android android-notifications android-permissions onactivityresult
1个回答
0
投票

首先,这是针对您的用例使用自定义

ActivityResultContract
的示例代码。另外,您可以查看此文档

public class MainActivity extends AppCompatActivity {

    private final ActivityResultLauncher<Intent> startForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
        if (!Settings.canDrawOverlays(this)) {
            // Show error toast, etc..
            return;
        }

        // Do whatever you want
    });

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:" + getPackageName()));
        startForResult.launch(intent);
    }


}

其次,我建议您在发送通知时检查权限。
即使用户在您的应用程序入口点(例如 MainActivity 或服务)中允许您的应用程序的通知权限,用户也可以随时在系统设置中更改权限。
因此,开发人员有责任为这种情况做好准备。

© www.soinside.com 2019 - 2024. All rights reserved.