2016-06-16 15 views
8

Ich versuche Android Direct Reply Benachrichtigung in meiner App zu implementieren. Ich habe es erfolgreich in Android N Emulator implementiert. Aber es funktioniert nicht auf Marshmallow-Geräten. Wenn ich in der Benachrichtigung auf die Aktionsschaltfläche klicke, wird die Antwort-Edittext nicht in Geräten unter Android N angezeigt. Ich weiß, dass diese Funktion in Android N-Geräten funktioniert, da sie in WhatsApp verfügbar ist.Wie funktioniert die Android Direct Reply Notification-Funktion in Geräten vor Android N?

Meine Frage ist, wie es in pre Android N Geräte arbeiten zu machen? Ich teile meinen Code hier. Jede Hilfe wäre großartig. Vielen Dank.

MainActivity

import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.app.RemoteInput; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 

public class MainActivity extends AppCompatActivity { 

// Key for the string that's delivered in the action's intent. 
public static final String KEY_TEXT_REPLY = "key_text_reply"; 
private static final int notificationID = 1234; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 




    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

     startNotif(); 
     } 
    }); 
} 

private void startNotif() { 

    Intent intent = new Intent(this, NotificationReciever.class); 
// use System.currentTimeMillis() to have a unique ID for the pending intent 
    final PendingIntent pIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), intent, 0); 

    String replyLabel = "Reply"; 
    RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) 
      .setLabel(replyLabel) 
      .build(); 

    // Create the reply action and add the remote input. 
    Notification.Action action = 
      new Notification.Action.Builder(R.drawable.ic_send, 
        "Action", pIntent) 
        .addRemoteInput(remoteInput) 
        .build(); 

    // Build the notification and add the action. 
    Notification newMessageNotification = 
      new Notification.Builder(MainActivity.this) 
        .setSmallIcon(R.drawable.ic_remove_circle_black_48dp) 
        .setContentTitle("Title") 
        .setContentText("Content") 
        .addAction(action).build(); 

// Issue the notification. 
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    manager.notify(notificationID, newMessageNotification); 
    } 
} 

NotificationReciever

import android.app.Activity; 
import android.app.RemoteInput; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.Toast; 

/** 
* Created by User on 13-Jun-16. 
*/ 
public class NotificationReciever extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Toast.makeText(this,getMessageText(getIntent()),Toast.LENGTH_SHORT).show(); 
    } 

    private CharSequence getMessageText(Intent intent) { 
     Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); 
     if (remoteInput != null) { 
      return remoteInput.getCharSequence(MainActivity.KEY_TEXT_REPLY); 
     } 
     Toast.makeText(this,"Remoteinput is null",Toast.LENGTH_SHORT).show(); 

     return null; 
    } 
} 
+0

Sie Antworten gefunden? – Prakash

+0

@Prakash Ich habe alles versucht, aber direkte Antwort hat nicht auf Versionen unter Noughat. So wie TommyChan in der Antwort unten gesagt hat, müssen wir eine Aktivität starten, die das tut, was wir wollen, mit einer direkten Antwort wie Layout darin. Ich denke, so wird es in WhatsApp gemacht. Korrigiere mich, wenn ich falsch liege. :) –

+0

@SudheeshMohan Ich versuche, die gleiche Sache zu implementieren. Können Sie uns bitte mitteilen, wie Sie dieses Problem gemeistert haben und welche Lösung Sie gefunden haben? –

Antwort

2

In der Dokumentation es Sie nicht verwenden, um einen Rundfunkempfänger oder einen Dienst für api unter N. sagt also Sie eine Aktivität starten, müssten die tut was Sie wollen und wickeln Sie es stattdessen in eine ausstehende Absicht.

if (isDirectReplySupported) { 
    return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT); 
} 
return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
+0

also die WhatsApp (unter N) von Android Wear unterstützten Antwort statt direkter Antwort eine Aktivität tatsächlich startet für die Beantwortung? –

+2

Höchstwahrscheinlich. In der Aktivität würden sie einen Code haben, der die Absicht analysiert und wenn eine Markierung, wie eine direkte Antwort, dort ist, wird eine Nachricht gesendet. Dies war das Muster für Wear-Apps vor N. –

-1

diese Funktion Implementierung ist sehr einfach, zuerst einen broadcastreceiver machen, wie üblich, eine Aktionstaste erstellen & mit PendingIntent hook up.

verbinden dann diese Absicht Benachrichtigungsobjekt drücken & benachrichtigen.

In broadcastreceiver behandeln die Lesetextteil & Aktualisierung auf Benachrichtigung.

Siehe Beitrag für die Proben Beispiel http://www.feelzdroid.com/2017/01/android-n-inline-reply-push-notifications.html