你好,我正在开发一个应用的VoIP功能,并尝试处理应用程序被杀死的情况。我的想法是使用FCM通知并运行活动,显示用户接收呼叫屏幕。当手机未锁定时,它按预期工作,但当手机锁定时就不是这样了。
我尝试了以下方法:
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true);
setTurnScreenOn(true);
}else{
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
我尝试在清单文件中为活动添加标志但没有成功。我还尝试将它放在 super.onCreate() 之前,在 super.onCreate() 之后以及在 setContentView() 之后,但都没有成功。
我只想要与Viber和WhatsApp相同的行为。但目前我已经没有想法他们是如何做到的。
我在PocoPhone F1上使用了最新的更新来测试以上代码。
编辑
这里是FirebaseMessagingService的一部分,我在其中接收和处理推送通知。
public class NotificationService extends FirebaseMessagingService {
private static final String TYPE = "type";
private static final String VIDEO_CALL = "video_call";
@Override public void onMessageReceived(RemoteMessage remoteMessage){
Map<String,String> data = remoteMessage.getData();
if(data.containsKey(TYPE) && data.get(TYPE).equals(VIDEO_CALL)){
Intent videoCallIntent = new Intent(this, VideoCallActivity.class);
videoCallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(videoCallIntent);
}
}
}
这是推送通知的有效载荷
{
"to": "...",
"data" : {
"type" : "video_call"
},
"priority":"high",
"ttl": 3600
}
更新:
我设法解决了这个问题。Alex的回答是正确的,但小米设备在设置中有一个“在锁定屏幕上显示”的选项,我需要启用它。这也是我对Android操作系统感到有点沮丧的原因之一。
FirebaseMessagingService
实现和一个完整的推送消息json 数据
样例,该样例是发送给应用程序的。 - Alex