全屏意图未启动活动,但在 android 10 上显示通知



我尝试使用下一个代码启动广播接收器的活动

Intent i = new Intent(context, AlarmNotification.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // This is at least android 10...
NotificationManager mgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (mgr.getNotificationChannel(CHANNEL_WHATEVER)==null) {
mgr.createNotificationChannel(new NotificationChannel(CHANNEL_WHATEVER,
"Whatever", NotificationManager.IMPORTANCE_HIGH));
}
mgr.notify(NOTIFY_ID, buildNormal(context, i).build());
}
private NotificationCompat.Builder buildNormal(Context context, Intent intent) {
NotificationCompat.Builder b=
new NotificationCompat.Builder(context, CHANNEL_WHATEVER);
b.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setSmallIcon(android.R.drawable.ic_lock_idle_alarm)
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(TEXT)
.setContentText(TEXT)
.setFullScreenIntent(buildPendingIntent(context, intent), true);
return(b);
}
private PendingIntent buildPendingIntent(Context context, Intent intent) {
return(PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
}

一开始,一切正常。但是如果我进入应用程序设置,请关闭CHANNEL_WHATEVER的通知通道,然后再次打开。稍后,当我调用 NotificationManager.notify 时,它会在通知抽屉中显示通知,但不启动活动。如果我删除该应用程序并重新安装,它会再次正常工作。这是我应该报告的android 10的错误,还是我可以做些什么?

在Android 10中,我们需要添加USE_FULL_SCREEN_INTENT权限

全屏意图的权限更改

  • 如果应用以 Android 10 或更高版本为目标平台并使用全屏通知,则必须在其应用的清单文件中请求USE_FULL_SCREEN_INTENT权限。

  • 这是正常权限,因此系统会自动将其授予请求应用。

确保您已在清单文件中添加了权限

示例代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.nilu.demo">
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

即使您使用全屏意图,Android 也不会授予显示该活动的权限:

在某些平台上,系统 UI 可能会选择显示提醒 通知,而不是在用户 使用设备。

请仔细阅读我关于 medium 的文章,了解如何在 OS 10 上全屏启动活动。本文还介绍了如何显示提醒通知和处理操作按钮单击。

https://medium.com/@dcostalloyd90/show-incoming-voip-call-notification-and-open-activity-for-android-os-10-5aada2d4c1e4

不确定这是否得到了回答。除了前面提到的权限... 我发现完成这项工作的唯一方法是使用"NotificationManager.IMPORTANCE_HIGH"频道和通知。 设置为"高"后,如果屏幕关闭,将打开全屏意图。 稍后更改频道似乎需要卸载并重新安装。

在发送通知之前设置通知通道(另请参阅(:

private static void createNotificationChannel(Context context) {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = **"YOUR CHANNEL"**;
String description = "YOUR CHANNEL DESCRIPTION";
int importance = **NotificationManager.IMPORTANCE_HIGH**;
NotificationChannel channel = new NotificationChannel( "YOUR CHANNEL ID", name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}

我设置了两个意图,不清楚您是否必须同时设置:

createNotificationChannel((context));
...
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, **"YOUR CHANNEL**");
builder.setContentIntent(pendingIntent);
builder.setFullScreenIntent(pendingIntent,true);

如果要在锁定屏幕上显示自己的活动,则需要在清单中启用showOnLockScreen

<activity android:name="NewActivity" android:showOnLockScreen="true" /> 

并在活动类中设置标志显示何时锁定:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true);
setTurnScreenOn(true);
}
}

最后,使用活动类创建一个全屏意图并将其附加到通知

Intent fullScreenIntent = new Intent(applicationContext, NewActivity.class);
PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(applicationContext, 0,
fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(applicationContext, channel)
.setSmallIcon(R.drawable.ic_small)
.setContentTitle(textTitle)
.setContentText(textContent)
.setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setCategory(NotificationCompat.CATEGORY_ALARM)
.setFullScreenIntent(fullScreenPendingIntent, true)
.setAutoCancel(true);

在显示通知之前,您应该唤醒Android的屏幕:

fun asquireWake() {
val mPowerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
val mWakeLock: PowerManager.WakeLock = mPowerManager.newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP,
"YourApp:Whatever"
)
mWakeLock.acquire()
}

就我而言,问题出在用于显示全屏意图通知的通知 ID 中。

如果我们的上一个通知具有相同的通知 ID,则不会启动全屏意图活动,而是在锁定屏幕中显示抬头通知。

因此,请尝试对全屏意向通知使用唯一的通知 ID。 有关如何设置全屏意向通知的详细信息:显示时效通知

对于有以下问题的人:

builder.setFullScreenIntent(pendingIntent, true(

请尝试使用:

builder.setContentIntent(pendingIntent(

相关内容

  • 没有找到相关文章

最新更新