Синхронизация 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-сообщения.