You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android后台接收来电时无法显示全屏通知问题求助

Android来电全屏通知无法显示问题排查

我希望应用接收来电时显示类似WhatsApp的全屏通知效果:当应用未启动时,弹出占满屏幕的视图(Activity或通知均可)。目前其他功能正常,但该视图始终仅显示为普通通知,无法全屏。以下是我的代码,烦请帮忙排查是否存在问题(比如缺失权限等)。

Intent incomingCallDialog = new Intent(context, IncomingCallActivity.class);
        incomingCallDialog.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        incomingCallDialog.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        if (context.getApplication() != null && ((MyApplication) context.getApplication()).getCurrentActivity() == null) {
            PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(context, 0,
                    incomingCallDialog, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

            NotificationCompat.Builder notificationBuilder =
                    new NotificationCompat.Builder(context);
            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher);
            notificationBuilder.setContentTitle(context.getString(R.string.incoming_call_from, email));
            notificationBuilder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
            notificationBuilder.setContentText(caller.getName());
            notificationBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
            notificationBuilder.setCategory(NotificationCompat.CATEGORY_CALL);
            notificationBuilder.setFullScreenIntent(fullScreenPendingIntent, true);
            notificationBuilder.setContentIntent(fullScreenPendingIntent);
            notificationBuilder.setTimeoutAfter(30 * 1000);
            notificationBuilder.setAutoCancel(true);
            notificationBuilder.setWhen(0);

            NotificationManager manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);

            String channelId = "my_channel";
            NotificationChannel channel = new NotificationChannel(
                    channelId,
                    "channelname",
                    NotificationManager.IMPORTANCE_HIGH);
            channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
            manager.createNotificationChannel(channel);
            notificationBuilder.setChannelId(channelId);

            manager.cancel(NOTIFICATION_CALL_ID);
            manager.notify(NOTIFICATION_CALL_ID, notificationBuilder.build());
        } else {
            context.startActivity(incomingCallDialog);
        }

排查方向及修复建议

1. 缺失必要权限

在AndroidManifest.xml中添加以下权限:

<!-- Android 6.0+ 弹出全屏窗口权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- Android 10+ 全屏通知权限 -->
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<!-- 点亮屏幕权限 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />

注意SYSTEM_ALERT_WINDOW权限需要动态申请,引导用户跳转到应用设置页面开启:

if (!Settings.canDrawOverlays(context)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
            Uri.parse("package:" + context.getPackageName()));
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}

2. IncomingCallActivity配置错误

给Activity设置全屏主题,在res/values/styles.xml中添加:

<style name="FullScreenCallTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowBackground">@color/black</item>
    <!-- Android 10+ 允许锁屏显示并点亮屏幕 -->
    <item name="android:showWhenLocked">true</item>
    <item name="android:turnScreenOn">true</item>
</style>

在Manifest中给Activity绑定主题:

<activity
    android:name=".IncomingCallActivity"
    android:theme="@style/FullScreenCallTheme"
    android:excludeFromRecents="true"
    android:launchMode="singleInstance" />

3. 通知渠道配置不完整

高优先级通知需要配置声音、震动,确保系统识别为重要通知,修改渠道创建代码:

String channelId = "my_channel";
NotificationManager manager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
if (manager.getNotificationChannel(channelId) == null) {
    NotificationChannel channel = new NotificationChannel(
            channelId,
            "来电通知",
            NotificationManager.IMPORTANCE_HIGH);
    channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
    // 添加震动
    channel.setVibrationPattern(new long[]{1000, 1000, 1000});
    channel.enableVibration(true);
    // 添加来电铃声
    Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
    channel.setSound(ringtoneUri, AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
            .build());
    manager.createNotificationChannel(channel);
}

4. PendingIntent适配问题

Android 12及以上,若需要动态修改Intent内容,需将PendingIntent.FLAG_IMMUTABLE替换为PendingIntent.FLAG_MUTABLE;若不需要修改则保留FLAG_IMMUTABLE即可。

5. 系统设置限制

需确保用户未在系统设置中关闭应用的「弹出通知」权限,或降低通知优先级,可引导用户检查应用的通知设置页面。

内容的提问来源于stack exchange,提问作者Anael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:10:27