Синхронизация SMS в фоновом режиме Android

Я обнаружил очень странную проблему, которая выглядит так:

Проблема заключается в том, что если я продолжу обмениваться сообщениями с кем-то, то мое приложение будет корректно извлекать все сообщения последовательно, но между ними, если есть какое-либо прерывание, такое как открытие другого приложения или перехват с каким-либо другим устройством на устройстве, мое приложение прекращает получать сообщения, и в этом случае нам нужно открыть приложение, и оно снова начнет загружать сообщения, но пропустить исходящее сообщение, которое мы отправили, а также связываться с другими вещами.

Для этого извлечения SMS я использую свой пользовательский SMSContentObserver для извлечения SMS. И я сохраняю последние SMSID для получения новых сообщений после этого каждый раз.

Пожалуйста, помогите мне здесь, так как я не могу понять причину этого.

Вот фрагмент кода:

public class SMSContentObserver extends ContentObserver
    {
        public SMSContentObserver()
        {
            super(null);
        }

        @Override
        public void onChange(boolean selfChange)
        {
            super.onChange(selfChange);
            Log.e("", "~~~~~~" + selfChange);
            try{

                appContactList = new ArrayList<HashMap<String, String>>();
                appContactList = databaseHandler.getAllappContact();
                if(appContactList.size() != 0){
                    try{
                        for (int i = 0; i < appContactList.size(); i++) {

                            strcontactname = appContactList.get(i).get("app_contact_name");
                            strcontactnumber = appContactList.get(i).get("app_contact_number");
                            strcontactid = appContactList.get(i).get("app_contact_id");
                            strsmsid = appContactList.get(i).get("app_contact_smsid");
                            strsmsdate = appContactList.get(i).get("app_contact_smsdate");
                            jsonArray = new JSONArray();

                            fetchInboxSmsIncoming(1, UserID, strcontactid, strcontactname ,strcontactnumber ,strsmsid ,strsmsdate ,"in");
                            fetchInboxSmsIncoming(2, UserID, strcontactid,strcontactname  , strcontactnumber,strsmsid ,strsmsdate ,"out");

                            if (Constants.isNetworkAvailable(mContext))
                            {
                                new SMSListenerNetwork().execute();
                            }
                            else
                            {
                                Toast.makeText(PhoneContactListActivity.this, Constants.msgNoInternet, Toast.LENGTH_SHORT).show();
                            }
                        }
                    }catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                }
            }catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            }
        @Override
        public boolean deliverSelfNotifications()
        {
            return true;
        }
    }

Метод fetchInboxSmsIncoming:

public void fetchInboxSmsIncoming(int type, String userID2, String strcontactid2,
            String strcontactname2, String strcontactnumber2, String strsmsid2,
            String strsmsdate2, String direction) {
        // TODO Auto-generated method stub
        try{
            JSONObject obj = null;
            databaseHandler = new DatabaseHandler(mContext);
            Uri uriSms = Uri.parse("content://sms");
            Cursor cursor = this.getContentResolver()
                    .query(uriSms,
                            new String[] { "_id", "address", "date", "body",
                            "type", "read" }, "type=" + type , null,
                            "date" + " COLLATE LOCALIZED ASC");

            if (cursor != null) {
                cursor.moveToLast();
                int i = 0;
                if (cursor.getCount() > 0) {

                    do {
                        Log.e("message.messageNumber",cursor.getString(cursor
                                .getColumnIndex("address")));

                        String incomingmessagefromSMS = processWord(cursor.getString(cursor.getColumnIndex("address")));
                        String incomingmessagefromPhone = processWord(strcontactnumber2);


                        if((incomingmessagefromSMS.contains(incomingmessagefromPhone)) && Integer.parseInt(cursor.getString(cursor.getColumnIndex("_id"))) > Integer.parseInt(strsmsid2)){
                            obj = new JSONObject();

                            //Toast.makeText(mContext, ""+incomingmessagefromSMS+" = " +incomingmessagefromPhone, Toast.LENGTH_LONG).show();
                            try {
                                String _id = cursor.getString(cursor.getColumnIndex("_id"));
                                String date =  cursor.getString(cursor.getColumnIndex("date"));
                                Long timestamp = Long.parseLong(date);    
                                Calendar calendar = Calendar.getInstance();
                                calendar.setTimeInMillis(timestamp);
                                DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                                obj.put("Date", formatter.format(calendar.getTime()));
                                String text = cursor.getString(cursor.getColumnIndexOrThrow("body"));
                                if(text.contains("\""))
                                    text = text.replace("\"", "");

                                obj.put("Text", text);
                                obj.put("UserID", userID2);
                                obj.put("ContactID",strcontactid2);
                                obj.put("Direction",direction);
                                if(i == 0){
                                    databaseHandler.insertappContact(strcontactid2, strcontactname2, strcontactnumber2, _id, formatter.format(calendar.getTime()));
                                    i = 1;
                                }
                                //Toast.makeText(mContext, "SMS"+obj, Toast.LENGTH_LONG).show();
                                jsonArray.put(obj);
                            } catch (IllegalArgumentException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                                //Toast.makeText(mContext, "SMS Exception"+e, Toast.LENGTH_LONG).show();
                            } catch (JSONException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                                //Toast.makeText(mContext, "SMS Exception"+e, Toast.LENGTH_LONG).show();
                            }

                        }
                        if(!cursor.getString(cursor
                                .getColumnIndex("address")).contains(strcontactnumber2)){
                            break;
                        }
                    } while (cursor.moveToPrevious());
                }
            }

            if(type == 1){
                Log.e("jsonArray 1 ",""+jsonArray);
            }else{
                Log.e("jsonArray 2",""+jsonArray);
            }
        }catch(Exception e){
            e.printStackTrace();
            //Toast.makeText(mContext, "SMS Exception"+e, Toast.LENGTH_LONG).show();
        }
    }

SMSListenerNetwork Async Задача:

открытый класс SMSListenerNetwork расширяет AsyncTask{

    protected void onPreExecute() {
        super.onPreExecute();
    }
    @Override
    protected Boolean doInBackground(Void... params) {

        try{

            String url = Constants.API_URL + "MessageConversation";
            List<NameValuePair> Parameters = new ArrayList<NameValuePair>();


            JSONObject obj = new JSONObject();
            String json = null;
            try {
                json = obj.put("users", jsonArray).toString();
            } catch (JSONException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            Parameters.add(new BasicNameValuePair("ConversationText",json ));
            Parameters.add(new BasicNameValuePair("DeviceID", androidToken));
            Parameters.add(new BasicNameValuePair("Token", securitytoken));

            ServerResponse response = jsonParser.postData(Parameters, url, Constants.API_RESPONSE_TYPE_JSON_OBJECT);
            Log.e("Parameters",""+Parameters);
            Log.e("url",""+url);
            System.out.println("Responce:"+response);
            Log.e("Responce",""+response);
            if(response.getStatus() == Constants.RESPONSE_STATUS_CODE_SUCCESS){
                JSONObject jsonObj = response.getjObj();

                System.out.println("jsonObjEmp:"+jsonObj);
                try {
                    response_message = jsonObj.getString("msg");
                    String status = jsonObj.getString("status");
                    if(status.equals("Success") || response_message.equals("Data is missing"))
                    {
                        return true;
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
        return false;
    }
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);


        if(result)
        {
            try {
                if(jsonArray.isNull(0)){
                    Log.e("SMSRECEIVER", "SMS response_message "+"Data is missing");                        
                }else{
                    Log.e("SMSRECEIVER", response_message);
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        else
        {
            Log.e("SMSRECEIVER", response_message);
        }
    }
}

Пожалуйста, предоставьте некоторые предложения здесь.

Заранее спасибо.

1 ответ

Может быть, вы можете использовать Сервис для его запуска. Или попробуйте добавить приемник SMS в свой Androidmanifest.xml. И перезагрузите все SMS при получении нового SMS-сообщения.

Другие вопросы по тегам