8

Próbuję zaimplementować powiadomienia Android Direct Reply w mojej aplikacji. Udało mi się go skutecznie wdrożyć w emulatorze Android N. Ale nie działa na urządzeniach Marshmallow. Kiedy klikam przycisk akcji w powiadomieniu, odpowiedź edittext nie jest wyświetlana na urządzeniach pod Androidem N. Wiem, że ta funkcja będzie działać na urządzeniach z systemem Android N, ponieważ jest dostępna w WhatsApp.Jak sprawić, by funkcja powiadamiania o bezpośrednim dostępie do systemu Android działała na urządzeniach pre-Android N?

Moje pytanie brzmi: jak to działa na urządzeniach z Androidem N? Udostępniam tutaj mój kod. Każda pomoc byłaby świetna. Dzięki.

główną działalność

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

Czy znalazłeś odpowiedzi? – Prakash

+0

@Prakash Próbowałem wszystkiego, ale bezpośrednia odpowiedź nie działała w wersjach poniżej Noughat. Tak jak TommyChan powiedział w poniższej odpowiedzi, będziemy musieli uruchomić działanie, które zrobi to, co chcemy, z bezpośrednią odpowiedzią, taką jak układ. Myślę, że tak to jest zrobione w WhatsApp. Popraw mnie, jeśli się mylę. :) –

+0

@SudheeshMohan Próbuję wprowadzić to samo. Czy możesz powiedzieć, jak udało Ci się rozwiązać ten problem i jakie jest najlepsze rozwiązanie, które znalazłeś? –

Odpowiedz

2

W docs mówi, aby nie używać odbiornika rozgłaszania lub usługi dla API poniżej N. Więc trzeba by rozpocząć działalność, która robi to, co chcesz, i zamiast tego zawija je w oczekiwaniu.

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

Więc Whatsapp (poniżej N) faktycznie uruchamia działanie odpowiadające zamiast bezpośredniej odpowiedzi? –

+2

Najprawdopodobniej. W działaniu mieliby kod, który analizowałby intencje i gdyby flaga taka jak bezpośrednia odpowiedź była tam, wyśle ​​wiadomość. To był wzorzec dla aplikacji zużycia przed N. –

-1

Realizacja tej funkcji jest bardzo prosta, najpierw zrobić jeden broadcastreceiver, jak zwykle utworzyć przycisk działania & podłączyć z pendingintent.

Następnie połącz tę intencję, aby powiadomić obiekt powiadomień &.

W odbiorniku radiowym obsługiwać czytanie części tekstowej & aktualizowanie do powiadomienia.

Skorzystaj z tego wpisu w przykładowym przykładzie: http://www.feelzdroid.com/2017/01/android-n-inline-reply-push-notifications.html

Powiązane problemy