我正在尝试将在 Android 7 上运行的应用程序迁移到 Android 13。我注意到迁移后应用程序通知不再弹出。 然后我读了这篇文章:https://developer.android.com/develop/ui/views/notifications/notification-permission并发现用户必须明确允许它们。 我实现了权限请求/授予,但通知仍然没有显示。以下是应用程序源代码的相应摘录。
public class MyActivity extends AppCompatActivity {
private static final String CHANNEL_ID = "12345";
public static final int NEWS_NOTIFICATION_ID = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// Prompt user to permit notifications
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!shouldShowRequestPermissionRationale(String.valueOf(PERMISSION_REQUEST_CODE))){
getNotificationPermission();
}
}
}
...
public void getNotificationPermission(){
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.POST_NOTIFICATIONS},
PERMISSION_REQUEST_CODE);
}
} catch (Exception e) {
Log.e(TAG, "Unable to request permission", e);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d("Permission is granted in onRequestPermissionsResult()");
} else {
Log.d("Permission is not granted in onRequestPermissionsResult()");
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void showNotification(String msg) {
Intent resultIntent = new Intent(getApplicationContext(), MyActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
stackBuilder.addNextIntentWithParentStack(resultIntent);
PendingIntent resultPendingIntent=null;
resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_MUTABLE);
Notification notification = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID)
.setTicker("ticker")
.setSmallIcon(R.drawable.app_icon90x90)
.setContentTitle(msg)
.setContentText("").setContentIntent(resultPendingIntent)
.setAutoCancel(true)
.build();
NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(NEWS_NOTIFICATION_ID, notification);
}
...
}
当我调试应用程序时,会发生以下情况:
应用程序显示一个对话框。 我允许通知,然后转到手机设置并查看该应用程序位于相应的列表中并且已启用。 然后我按下应用程序中的一个按钮来触发方法调用:
showNotification("Hello world");
不显示通知,也不显示错误。
可能缺少什么? Android 13 中的通知构造是否有所不同,或者是否存在其他一些手机设置可能会阻止其显示? 我可以在模拟器和手机上观察到问题。
当我尝试你的代码时,我发现它出现“未找到频道”错误。您应该从 API 26 级别开始创建通知通道。
这是代码的编辑版本:
public void getNotificationPermission() {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "YOUR_CHANNEL_NAME", importance);
channel.setDescription("CHANNEL_DESCRIPTION");
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.POST_NOTIFICATIONS},
PERMISSION_REQUEST_CODE);
}
} catch (Exception e) {
Log.e(TAG, "Unable to request permission", e);
}
}
当我尝试这段代码时,我看到通知已成功发送。