2015-09-03 4 views
15

Ich habe meinen Kopf gegen den Tisch mit diesem Problem seit 3 ​​Tagen geschlagen, bitte sagen Sie mir, wo ich mich verirrt habe.Full Screen Notification nur als Heads Up

Wenn ich einen eingehenden VoIP-Anruf erhalte, versuche ich eine Vollbildbenachrichtigung zu zeigen, genau wie die PhoneApp. Mir geht es gut mit Heads-up, wenn der Benutzer in einer immersiven Aktivität ist. Allerdings erhalte ich nur eine Benachrichtigung über den Kopf und bekomme nie einen ganzen Bildschirm. Ich brauche eine Benachrichtigung, um den Sperrbildschirm ebenfalls zu ignorieren. Hier

ist, was ich tue:

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); 

Hier ist der creatCallIntent Code:

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; 
} 

Und hier ist die 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); 

ich versucht habe, Starten Sie diese Aktivität direkt (Uber ist Anwendungsreferenz)

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); 

Was mache ich falsch?

+0

[Notification.fullScreenIntent:] (https://developer.android.com/reference/android/app/Notification.html#fullScreenIntent) Die Systembenutzeroberfläche kann eine Heads-up-Benachrichtigung anzeigen, anstatt diese Absicht zu starten , während der Benutzer das Gerät verwendet. – adneal

+0

Ja nein, ich verstehe das, aber offensichtlich "wählt" mein Handy den ganzen Bildschirm aus, warum nicht für meine App? Meine Telefon-App zeigt korrekt Heads-Up an, wenn ich in einer immersiven Aktivität bin. – Leo

+0

@Leo Wenn eine Benachrichtigung mit der ID INCOMING_CALL_NOTIFICATION_ID bereits aktiv ist, wird fullScreenIntent für die neue Benachrichtigung ignoriert. Könnte das das Problem sein, mit dem Sie es zu tun haben? – Vikram

Antwort

2

Ich habe es herausgefunden! Es war etwas dummes, so wie ich es vermutet hatte.

In meinem IncomingCallActivity hatte ich das folgende Stück Code

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

Es stellt sich heraus, dass etwas mit, wie Benachrichtigungen zu tun haben tatsächlich bekommen gezeigt fordert daher die Aktivität beenden.

Dank @JohanShogun für den Versuch zu helfen.

+0

Ich glaube nicht, dass Sie FLAG_DISMISS_KEYGUARD benötigen. Auf diese Weise ist das Telefon des Benutzers immer noch gesperrt, wenn sie auflegen. Ein zusätzlicher Sicherheitsvorteil. –

+0

Sie tun, Sie können jemanden Telefon so nicht entsperren, es ignoriert nur vorübergehend das Schloss. – Leo

+0

Ich weiß für Tatsache, dass FLAG_DISMISS_KEYGUARD das Gerät entsperren wird, wenn der Benutzer keine sichere Sperre hat, wie wenn der Benutzer nur Swipe-zu-entsperren konfiguriert hat. Sie haben jedoch recht, wenn der Benutzer ein Pin-Muster konfiguriert hat –

3

Wenn ich Ihre Frage richtig verstanden habe, vergessen Sie Flagge 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); 

Diese Kombination Aktivität zu zeigen, benötigt hinzuzufügen, während Bildschirm gesperrt ist. Hoffe es hilft.

+0

Nein, das hatte nichts damit zu tun. – Leo