He construido una aplicación de chat . Se está trabajando muy bien . tanto los usuarios pueden chatear fácilmente
pero donde quedo Atascado es el caso de un usuario de la aplicación está en segundo plano y que la pantalla está apagada , el usuario es incapaz de ser notificado de que el mensaje recibido.

Lo que quiero ahora es en mi aplicación cuando el usuario envía un mensaje a usuario b , y userB móvil está inactivo, pero la aplicación que se está ejecutando en segundo plano, userB puede obtener una notificación sobre ese mensaje. y el usuario b puede abrir el chat y leer el mensaje .

Mi firebase notificación es trabajar desde la base avanzada de la consola, pero no sé cómo llamar a instancia de identificación y enviar a dispositivo en particular de la api y en particular, el usuario recibe una notificación sobre el mensaje recibido , cuando la pantalla está apagada y la aplicación se está ejecutando en segundo plano estatal . ¿Cómo debo conseguirlo?

Tengo mi base avanzada de id de instancia de la clase de servicio aquí:

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
    private static final String TAG = "MyFirebaseIIDService";

    @Override
    public void onTokenRefresh() {

        //Getting registration token
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        //Displaying token on logcat
        Log.d(TAG, "Refreshed token: " + refreshedToken);
    }

    private void sendRegistrationToServer(String token) {
        //You can implement this method to store the token on your server
        //Not required for current project
    }
}

Aquí está mi MyFirebase Servicio de Mensajería de Clase

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (remoteMessage.getNotification().getBody() != null) {
            Log.e("FIREBASE", "Message Notification Body: " + remoteMessage.getNotification().getBody());
            sendNotification(remoteMessage);
        }
    }

    private void sendNotification(RemoteMessage remoteMessage) {
        RemoteMessage.Notification notification = remoteMessage.getNotification();
        Intent intent = new Intent(this, LoggedInView.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.first_aid))
                .setSmallIcon(R.drawable.first_aid)
                .setContentTitle(notification.getTitle())
                .setContentText(notification.getBody())
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder.build());
    }
}

Aquí está mi chat Actividad:

public class Chat extends AppCompatActivity {
    LinearLayout layout;
    ImageView sendButton,vidcall;
    EditText messageArea;
    ScrollView scrollView;
    Firebase reference1, reference2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_chat);

        layout = (LinearLayout)findViewById(R.id.layout1);
        sendButton = (ImageView)findViewById(R.id.sendButton);
        vidcall = (ImageView)findViewById(R.id.vidBtnk);
        messageArea = (EditText)findViewById(R.id.messageArea);
        scrollView = (ScrollView)findViewById(R.id.scrollView);

        Firebase.setAndroidContext(this);
        reference1 = new Firebase("https://*******.firebaseio.com/messages/" + UserDetails.username + "_" + UserDetails.chatWith);
        reference2 = new Firebase("https://*******.firebaseio.com/messages/" + UserDetails.chatWith + "_" + UserDetails.username);

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String messageText = messageArea.getText().toString();

                if(!messageText.equals("")){
                    Map<String, String> map = new HashMap<String, String>();
                    map.put("message", messageText);
                    map.put("user", UserDetails.username);
                    reference1.push().setValue(map);
                    reference2.push().setValue(map);
                }
                messageArea.setText("");
            }
        });

        vidcall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                startActivity(new Intent(Chat.this, ConnectActivity.class));



            }
        });

        reference1.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Map map = dataSnapshot.getValue(Map.class);
                String message = map.get("message").toString();
                String userName = map.get("user").toString();

                if(userName.equals(UserDetails.username)){
                    addMessageBox("You:-\n" + message, 1);
                }
                else{
                    addMessageBox(UserDetails.chatWith + ":-\n" + message, 2);
                }
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
    }


   //boolean doubleBackToExitPressedOnce = false;

    @Override
    public void onBackPressed() {

        AlertDialog.Builder builder1 = new AlertDialog.Builder(Chat.this);
        builder1.setMessage("CAUTION! -> Do Wish to End this Session");
        builder1.setCancelable(true);
        builder1.setPositiveButton(
                "Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        finish();

                        dialog.cancel();
                    }
                });

        builder1.setNegativeButton(
                "No",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });

        AlertDialog alert11 = builder1.create();
        alert11.show();


    }


    public void addMessageBox(String message, int type){
        TextView textView = new TextView(Chat.this);
        textView.setText(message);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lp.setMargins(0, 0, 0, 10);
        textView.setLayoutParams(lp);

        if(type == 1) {
            textView.setBackgroundResource(R.drawable.rounded_corner1);
        }
        else{
            textView.setBackgroundResource(R.drawable.rounded_corner2);
        }

        layout.addView(textView);
        scrollView.fullScroll(View.FOCUS_DOWN);
    }
}
InformationsquelleAutor Addi.Star | 2017-01-19

3 Comentarios

  1. 15

    Usted necesita un servicio que se ejecuta en segundo plano para la captura de la notificación de INSERCIÓN y se muestra al usuario, y eso es lo que la base avanzada de Notificación de Servicio le proporciona. Tengo este (que tendrá que modificar para hacer lo que quieres hacer cuando una notificación se mostró arriba):

    public class MyFirebaseMessagingService extends FirebaseMessagingService {
    
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            if (remoteMessage.getNotification().getBody() != null) {
                Log.e("FIREBASE", "Message Notification Body: " + remoteMessage.getNotification().getBody());
                sendNotification(remoteMessage);
            }
        }
    
        private void sendNotification(RemoteMessage remoteMessage) {
            RemoteMessage.Notification notification = remoteMessage.getNotification();
            Intent intent = new Intent(this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                    PendingIntent.FLAG_ONE_SHOT);
    
            Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.logo_gris))
                    .setSmallIcon(R.drawable.logo_gris)
                    .setContentTitle(notification.getTitle())
                    .setContentText(notification.getBody())
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);
    
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
            notificationManager.notify(0, notificationBuilder.build());
        }
    
    
    }
    • No tengo idea de cómo integrar firebase servicio de notificación en mi actual aplicación de chat , puede proporcionar cualquier ejemplo completo o tutorial .
    • ok he intentado yor solución y capaz de recibir la notificación de la base avanzada de la consola , pero quiero integrar en mi chat de la clase
    • ¿Qué quieres que haga?
    • Ver a mi chat.java clase . En esta clase puedo enviar/recibir mensajes de texto . ahora, cuando un usuario móvil que la pantalla está apagada o la aplicación está en segundo plano . el usuario debe recibir una notificación sobre el mensaje que se recibe y lo que uno puede haga clic en abrir para leer el mensaje .
    • ¿cómo debo llamar a la notificación de la api y enviarlo al usuario particular y detectar a tiempo la solicitud de que la pantalla está apagada y la aplicación está en segundo plano
    • hasta ahora sé que el identificador de instancia de símbolo (token) se utiliza para enviar firebase de notificación para el usuario en particular dispositivo . y con ese token podemos construir un mecanismo para la notificación de la api . pero no he encontrado ningún ejemplo de trabajo o tutorial para integrar en mi chat.java clase
    • cualquier solución a mi problema, compruebe editado pregunta

  2. 0

    He resuelto este problema puede ayudar a alguien ,

    Para el envío de la Notificación de la base avanzada a través de la api de un único dispositivo es el siguiente:

    1: generar el Id de Instancia , único para cada dispositivo

    public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
    private static final String TAG = "MyFirebaseIIDService";
    
    @Override
    public void onTokenRefresh() {
    
        //Getting registration token
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    
        //Displaying token on logcat
        Log.d(TAG, "Refreshed token: " + refreshedToken);
    
        sendRegistrationToServer(refreshedToken);
    
    }
    
    private void sendRegistrationToServer(String token) {
        //You can implement this method to store the token on your server
        //Not required for current project
    
    
    
    
    }
    
    }

    Nota: usted puede llamar a la Id de Instancia de cualquier lugar de su Aplicación Como esta:

    String tkn = FirebaseInstanceId.getInstance().getToken();
            Toast.makeText(Doc_users.this, "Current token ["+tkn+"]",
                    Toast.LENGTH_LONG).show();
            Log.d("App", "Token ["+tkn+"]");

    este token debe ser utilizado para enviar la notificación de un único dispositivo es el id del dispositivo que puede almacenar en su base avanzada de la base de datos

     reference.child(UserDetails.username).child("token").setValue(tokun);

    2:Ahora Usted puede construir su lógica para recuperar estos identificadores y construir su solicitud

    public static String makeRequest(String id) throws JSONException {
            HttpURLConnection urlConnection;
            JSONObject json = new JSONObject();
            JSONObject info = new JSONObject();
            info.put("title", "Notification Title");   //Notification title
            info.put("body", "Notification body"); //Notification body
            info.put("sound", "mySound"); //Notification sound
            json.put("notification", info);
            json.put("to","INSTANCE ID FETCHED FOR SIGNLE DEVICE HERE");
            Log.e("deviceidkey==> ",id+"");
            Log.e("jsonn==> ",json.toString());
            String data = json.toString();
            String result = null;
            try {
                //Connect
                urlConnection = (HttpURLConnection) ((new URL("https://fcm.googleapis.com/fcm/send").openConnection()));
                urlConnection.setDoOutput(true);
                urlConnection.setRequestProperty("Content-Type", "application/json");
                urlConnection.setRequestProperty("Authorization", "key=YOUR FIREBASE SERVER KEY");
                urlConnection.setRequestMethod("POST");
                urlConnection.connect();
    
                //Write
                OutputStream outputStream = urlConnection.getOutputStream();
                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
                writer.write(data);
                writer.close();
                outputStream.close();
    
                //Read
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
    
                String line = null;
                StringBuilder sb = new StringBuilder();
    
                while ((line = bufferedReader.readLine()) != null) {
                    sb.append(line);
                }
    
                bufferedReader.close();
                result = sb.toString();
    
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return result;
        }

    Notificación se generan en un único dispositivo envía desde tu dispositivo puede depurar a poner su propio dispositivo clave y el uso de cartero para solicitud válida: la Buena Suerte

  3. 0

    Hola me han aplicado el chat de la aplicación utilizando la base avanzada de mensajería.

    Aquí los pasos que se pueden implementar

    1) Implementar sendRegistrationToServer(token de Cadena) {
    Hacer llamada Asincrónica para almacenar token generado en el servidor back-end (usuario del mapa con el símbolo generado)
    }

    2) En el Chat Actividad sendmessage() debería mensaje al servidor para secondUser()

    3) Mirando en usertoken debemos de notificación de inserción de servidor back-end de base avanzada de servidor.

    4) Implementar onMessageReceived() para mostrar la notificación

Dejar respuesta

Please enter your comment!
Please enter your name here