7
respostas

Inserção de notificações dentro de uma lista!

Olá, boa tarde! Desculpe pela mudança de contextos, porém me identifiquei com a questão de armazenamento de textos dentro de uma lista! Sou desenvolvedor e estou fazendo um aplicativo onde eu redireciono todas as notificações que chegam no meu celular para uma ListView que está no meu app. Estou tendo problemas quando recebo a primeira mensagem do whatsapp, sendo que quando essa chega, no logcat, me retorna nulo. Alguma sugestão de como eu poderia armazenar todas as mensagens uma por uma dentro dessa lista? Código abaixo representa a classe que eu uso para "ouvir" essas notificações e armazená-las dentro do intent, para assim redirecioná-las, de fato, dentro da minha main, a notificação com o texto e a imagem da pessoa. Obrigado pela atenção!

package com.example.biels.testeprojeto;

import android.app.Notification;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

import java.io.ByteArrayOutputStream;


public class NotificationService extends NotificationListenerService {
    Context context;

    @Override

    public void onCreate() {

        super.onCreate();
        context = getApplicationContext();

    }
    @Override

    public void onNotificationPosted(StatusBarNotification sbn) {
        String pack = sbn.getPackageName();
        String ticker ="";
        if(sbn.getNotification().tickerText !=null) {
            ticker = sbn.getNotification().tickerText.toString();
        }
        Bundle extras = sbn.getNotification().extras;
        String title = extras.getString("android.title");
        String text = null;

         if (text == null) {

                if (extras.get("android.textLines") != null) {
                    CharSequence[] charText = (CharSequence[]) extras
                        .get("android.textLines");
                    if (charText.length > 0) {
                        text = charText[charText.length - 1].toString();
                    }
                }
        }
            int id1 = extras.getInt(Notification.EXTRA_SMALL_ICON);
            Bitmap id = sbn.getNotification().largeIcon;


            Log.i("Package",pack);
            Log.i("Ticker",ticker);
            Log.i("Title",title);
            Log.i("Text",text);

            Intent msgrcv = new Intent("Msg");
            msgrcv.putExtra("package", pack);
            msgrcv.putExtra("ticker", ticker);
            msgrcv.putExtra("title", title);
            msgrcv.putExtra("text", text);

            if(id != null) {
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                id.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] byteArray = stream.toByteArray();
                msgrcv.putExtra("icon",byteArray);
            }
            LocalBroadcastManager.getInstance(context).sendBroadcast(msgrcv);


        }

        @Override

    public void onNotificationRemoved(StatusBarNotification sbn) {
        Log.i("Msg","Notification Removed");

    }
}
7 respostas

Olá, tudo bem ?

Pode ser que os dados do wpp sejam criptografados e por esse motivo você não esteja conseguindo os recuperar.

A mesma coisa pode acontecer com dados de aplicativos com informações sensíveis, por exemplo bancos e facebook.

Olá Matheus, tudo certo! Então cara, eu consigo puxar as mensagens mesmo com a criptografia, pode ser que haja algum erro na minha lógica, sabe? Estranho é que a primeira mensagem que chega me retorna nulo... Enfim, obrigado pela resposta!

Olá, boa tarde! Assim que eu recebo uma notificação, ela é encaminhada para a minha lista, uma a uma, porém, no meu caso, essa primeira notificação é duplicada, por exemplo, quando eu mando um "oi" e logo após eu mando um " beleza?", na minha lista me retorna o seguinte: oi oi beleza? Alguma sugestão para que eu mude a minha lógica?! Segue a lógica para ler as notificações que chegam do celular :

Bundle extras = sbn.getNotification().extras;
Log.d("extras",extras.toString());
String title = extras.getString("android.title");
//TRATA AS NOTIFICAÇÕES FAZENDO COM QUE CADA MENSAGEM ENTRE DE UMA EM UMA DENTRO DA LISTA.
String text = null;

if (extras.getCharSequence("android.text") != null) {
    text = extras.getCharSequence("android.text").toString();
    Log.d("TEXTO",text);
}

    if (text != null) {
        if (extras.get("android.textLines") != null) {
            CharSequence[] charText = (CharSequence[]) extras
                    .get("android.textLines");
            if (charText.length > 0) {
                text = charText[charText.length - 1].toString();
                Log.d("texto", text);
            }
        }
    }

Acho que consegue ver a notificação e ver qual é o tipo dela, pois nesse caso ela tá sendo atualizada e não criando uma nova.

Teria alguma sugestão de algum código de que eu pudesse usar para cada nova notificação, eu armazenar em intents diferentes? A partir desse acima, eu armazeno a mensagem em somente um intent.

Abaixo segue o código aonde eu recebo o meu intent na minha MainActivity, e os repasso para meu servidor em forma de JSON, alocando mensagens e títulos de notificações dentro de um modelo de lista que já estava predefinido.

  private BroadcastReceiver onNotice = new BroadcastReceiver() {
        String msgEmpresa = "",msgData = "", msgHora = "", msgTipo ="E", msgImagem = "",msgLida="N";
        @Override
        public void onReceive(Context context, Intent intent) {
            // String pack = intent.getStringExtra("package");
            final String msgContato = intent.getStringExtra("title");
            final String msgCorpo = intent.getStringExtra("text");


            //int id = intent.getIntExtra("icon",0);

            Context remotePackageContext = null;
            try {
//                remotePackageContext = getApplicationContext().createPackageContext(pack, 0);
//                Drawable icon = remotePackageContext.getResources().getDrawable(id);
//                if(icon !=null) {
//                    ((ImageView) findViewById(R.id.imageView)).setBackground(icon);
//                }
                byte[] byteArray = intent.getByteArrayExtra("icon");
                Bitmap bmp = null;
                if (byteArray != null) {
                    bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
                }

                /*String image = intent.getStringExtra("image");
                byte[] decodedString = Base64.decode(image,Base64.DEFAULT);
                Bitmap decodedByte;
                decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);*/


                Model model = new Model();
                model.setName(msgContato + " " + msgCorpo);
                model.setImage(bmp);
               // model.setImage(decodedByte);

                if (modelList != null) {
                    modelList.add(model);
                    adapter.notifyDataSetChanged();
                } else {
                    modelList = new ArrayList<Model>();
                    modelList.add(model);
                    adapter = new CustomListAdapter(getApplicationContext(), modelList);
                    list = (ListView) findViewById(R.id.list);
                    list.setAdapter(adapter);
                }
                StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
                        new Response.Listener<String>() {
                            @Override
                            //RESPOSTA DO SERVIDOR!
                            public void onResponse(String response) {
                                Log.d("MENSAGEM: ","Mensagem adicionada com sucesso!");
                            }
                        }
                        , new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(MainActivity.this,"Error...", Toast.LENGTH_SHORT).show();
                        error.printStackTrace();
                    }
                }){
                    @Override
                    //ESCREVENDO A MENSAGEM!
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String,String> params = new HashMap<String, String>();
                        params.put("msgContato",msgContato);
                        params.put("msgEmpresa",msgEmpresa);
                        params.put("msgData",msgData);
                        params.put("msgHora",msgHora);
                        params.put("msgTipo",msgTipo);
                        params.put("msgCorpo",msgCorpo);
                        params.put("msgImagem",msgImagem);
                        params.put("msgLida",msgLida);

                        return params;
                    }
                };
                //ENVIANDO PARA O SERVIDOR!
                //Singleton.getInstance(MainActivity.this).addToRequestQueue(stringRequest);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

Esse tipo dela é definido através da peding intent, você pode pegar o tipo pela flag dela :

https://developer.android.com/reference/android/app/PendingIntent.html