当 phone 被锁定时从服务启动 activity Android 9.0(饼图)
Starting activity from Service when phone is locked Android 9.0(Pie)
您好,我正在为该应用开发 VoIP 功能,我正在尝试处理应用被终止的情况。我的想法是使用 FCM 通知和 运行 activity,这将显示用户来电屏幕。它在 phone 解锁时按预期工作,但在 phone 锁定时则不然。
我试过这个:
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);
}
我尝试在清单中向 activity 添加标志,但没有成功。我也试着把它放在 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
}
更新:
我设法解决了这个 issue.Alex 答案是正确的,但小米设备在我需要启用的设置中有选项 "Show on Lock screen"。这是我对 Android OS.
感到有点沮丧的原因之一
还通过在 if 语句中添加此请求(在 setTurnScreenOn(true);
):
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
if (keyguardManager!= null) {
keyguardManager.requestDismissKeyguard(this, null);
}
在 activity 的 onCreate()
中,您需要进行这些更改。
这里的activity显示一个红色的空activity即使设备被锁定
public class LockScreenActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//modify window flags so as to display it on lock screen
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// to wake up screen
PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
int wakeFlags = PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP;
if (Build.VERSION.SDK_INT <= 15) {
wakeFlags |= PowerManager.SCREEN_BRIGHT_WAKE_LOCK;
}
PowerManager.WakeLock wakeLock = pm.newWakeLock(wakeFlags, "MyApp:Call");
wakeLock.acquire(30000); //wakelock for 30 sec
View view = new View(this);
view.setBackgroundColor(Color.RED);
setContentView(view);
}
}
记得在清单中添加WAKE_LOCK
权限。
您好,我正在为该应用开发 VoIP 功能,我正在尝试处理应用被终止的情况。我的想法是使用 FCM 通知和 运行 activity,这将显示用户来电屏幕。它在 phone 解锁时按预期工作,但在 phone 锁定时则不然。
我试过这个:
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);
}
我尝试在清单中向 activity 添加标志,但没有成功。我也试着把它放在 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
}
更新:
我设法解决了这个 issue.Alex 答案是正确的,但小米设备在我需要启用的设置中有选项 "Show on Lock screen"。这是我对 Android OS.
感到有点沮丧的原因之一还通过在 if 语句中添加此请求(在 setTurnScreenOn(true);
):
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
if (keyguardManager!= null) {
keyguardManager.requestDismissKeyguard(this, null);
}
在 activity 的 onCreate()
中,您需要进行这些更改。
这里的activity显示一个红色的空activity即使设备被锁定
public class LockScreenActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//modify window flags so as to display it on lock screen
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
// to wake up screen
PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
int wakeFlags = PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP;
if (Build.VERSION.SDK_INT <= 15) {
wakeFlags |= PowerManager.SCREEN_BRIGHT_WAKE_LOCK;
}
PowerManager.WakeLock wakeLock = pm.newWakeLock(wakeFlags, "MyApp:Call");
wakeLock.acquire(30000); //wakelock for 30 sec
View view = new View(this);
view.setBackgroundColor(Color.RED);
setContentView(view);
}
}
记得在清单中添加WAKE_LOCK
权限。