【问题标题】:Starting activity from Service when phone is locked Android 9.0(Pie)手机锁定时从服务启动活动 Android 9.0(Pie)
【发布时间】:2019-08-17 01:38:28
【问题描述】:

您好,我正在为应用程序开发 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 OS 有点失望的原因之一。

【问题讨论】:

  • 您能否提供更多与实施相关的信息?您是否发送静默推送消息,这些消息是否到达应用程序?请添加FirebaseMessagingService 实现和发送到应用程序的推送消息json data 的完整示例
  • @Alex 我更新了问题

标签: android android-9.0-pie android-background


【解决方案1】:

还可以通过在 if 语句中添加此请求(在 setTurnScreenOn(true); 之后)请求 KEYGUARD_SERVICE 以解除更高的 API 级别:

    KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    if (keyguardManager!= null) {
        keyguardManager.requestDismissKeyguard(this, null);
    }

【讨论】:

  • 嗯好吧,也可能与接收或处理推送消息有关,能否提供更多信息? (见问题评论)
  • Alex 我更新了问题并将此答案标记为正确答案。感谢您的帮助。
  • 欢迎您,现在可以使用了!并且很高兴在这些设备的设置中找到该选项@harisk92
  • 此调用解除后是否需要恢复keyguard状态?
【解决方案2】:

在您的活动的onCreate() 中,您需要进行这些更改。 即使设备被锁定,此处的活动也会显示红色的空活动。

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 权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多