2016-06-16 10 views
8

Sto tentando di implementare la notifica di Android Direct Reply nella mia app. Sono riuscito a implementarlo con successo nell'emulatore Android N. Ma non funziona su dispositivi Marshmallow. Quando faccio clic sul pulsante di azione nella notifica, la risposta edittext non viene visualizzata nei dispositivi sotto Android N. So che questa funzione funzionerà in pre dispositivi Android N, in quanto è disponibile in WhatsApp.Come far funzionare la funzione di notifica di risposta diretta Android in dispositivi pre-Android N?

La mia domanda è come farlo funzionare in pre dispositivi Android N? Sto condividendo il mio codice qui. Qualsiasi aiuto sarebbe grande. Grazie.

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

Hai trovato le risposte? – Prakash

+0

@Prakash Ive ha provato tutto ma la risposta diretta non ha funzionato sulle versioni sotto Noughat. Quindi, come ha detto TommyChan nella risposta di sotto, dovremo avviare un'attività che fa ciò che vogliamo con una risposta diretta come il layout in esso. Penso che sia così che viene fatto in WhatsApp. Correggimi se sbaglio. :) –

+0

@SudheeshMohan Sto provando a implementare la stessa cosa. Puoi dire come hai gestito questo problema e qual è la soluzione migliore che hai trovato? –

risposta

2

nella documentazione ti dice di non utilizzare un ricevitore trasmissione o di un servizio per l'API di seguito N. Quindi si avrebbe dovuto lanciare un'attività che fa quello che vuoi e lo avvolge in un intento in sospeso.

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

Quindi il Whatsapp (sotto N) sta effettivamente avviando un'attività per rispondere invece di una risposta diretta? –

+2

Molto probabilmente. Nell'attività avrebbero codice che analizza l'intento e se una bandiera come la risposta diretta è lì, invierà un messaggio. Questo era il modello per le app di abbigliamento prima di N. –

-1

implementazione di questa caratteristica è molto semplice, per prima cosa uno broadcastreceiver, come al solito creare un pulsante di azione & collegare con pendingintent.

Quindi collegare l'intento per inviare notifica dell'oggetto & notifica.

In broadcastreceiver gestire la parte di testo di lettura & aggiornamento alla notifica.

consultare questo post per esempio campione http://www.feelzdroid.com/2017/01/android-n-inline-reply-push-notifications.html

Problemi correlati