我将对旧应用程序的支持扩展到 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;
}
这是否意味着我每次发送通知时都需要检查权限,或者这只是因为我没有在主要活动中或启动服务时检查/请求权限而出现?
首先,这是针对您的用例使用自定义
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 或服务)中允许您的应用程序的通知权限,用户也可以随时在系统设置中更改权限。
因此,开发人员有责任为这种情况做好准备。