web-dev-qa-db-ja.com

ヘッズアップとしてのみ表示される全画面通知

私はこの問題で3日間テーブルに頭をぶつけてきました、どこに迷ったのか教えてください。

VoIP通話が着信すると、PhoneAppと同じように、全画面通知を表示しようとしています。ユーザーが没入型のアクティビティを行っている場合は、頭を上げても大丈夫です。ただし、ヘッドアップ通知のみが表示され、全画面表示は表示されません。ロック画面も無視するように通知する必要があります。

これが私がしていることです:

    String callJson = call.toJson(uber).toString();
    uber.requestWakeState(UberVoice.WAKE_STATE_FULL);

    final Notification.Builder builder = new Notification.Builder(uber);
    builder.setSmallIcon(R.drawable.switch_notification);
    if (image != null) {
        builder.setLargeIcon(image);
    }
    builder.setOngoing(true);

    PendingIntent inCallPendingIntent =
            PendingIntent.getActivity(uber, 234,
                    UberVoice.createInCallIntent(), 0);
    builder.setContentIntent(inCallPendingIntent);

    builder.setContentText(body);
    builder.setUsesChronometer(false);

    builder.setContentTitle(title);

    builder.setCategory(Notification.CATEGORY_CALL);
    builder.setVisibility(Notification.VISIBILITY_PUBLIC);

    builder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), AudioManager.STREAM_RING);
    builder.setVibrate(new long[]{500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500});

    builder.setPriority(Notification.PRIORITY_MAX);
    builder.setTicker(title);
    builder.setFullScreenIntent(inCallPendingIntent, true);

    builder.addAction(R.drawable.hangup_action, "Reject", CallService.getPendingIntent(uber, callJson, CallService.REJECT));
    builder.addAction(R.drawable.answer_action, "Answer", CallService.getPendingIntent(uber, callJson, CallService.ANSWER));

    NotificationManager notificationManager = (NotificationManager) uber.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = builder.build();
    notificationManager.notify(INCOMING_CALL_NOTIFICATION_ID, notification);

CreatCallIntentコードは次のとおりです。

public static Intent createInCallIntent() {
    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
            | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
    intent.setClassName("<package>", IncomingCallActivity.class.getName());
    return intent;
}

そして、これがIncomingCallActivity.onCreate()です。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;

    getWindow().addFlags(flags);

    setContentView(R.layout.activity_incoming_call);

このアクティビティを直接開始してみました(uberはアプリケーションリファレンスです)

Intent incomingCallIntent = new Intent(uber, IncomingCallActivity.class);
String callJson = call.toJson(uber).toString();
incomingCallIntent.putExtra("call", callJson);

incomingCallIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

uber.startActivity(incomingCallIntent);

私は何が間違っているのですか?

22
Leo

理解した!思った通り、バカなことでした。

IncomingCallActivityには、次のコードが含まれていました

public void onPause() {
    super.onPause();
    finish();
}

通知の表示方法に関係する何かが実際にはonPauseを呼び出し、アクティビティを終了することがわかりました。

助けてくれた@JohanShogunに感謝します。

2
Leo

私があなたの質問を正しく理解したなら、あなたはフラグを追加するのを忘れましたWindowManager.LayoutParams.FLAG_FULLSCREEN in IncomingCallActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_FULLSCREEN;

    getWindow().addFlags(flags);

この組み合わせは、画面がロックされているときにアクティビティを表示するために必要でした。それが役に立てば幸い。

4
Yazazzello