2012-05-22 5 views
0

Я разрабатываю приложение, которое может управлять устройством с помощью SMS-команд; приложение должно выполнять команды из SMS и удалять этот Sms. Итак, код для управления работает, но я не могу удалить SMS. У меня есть следующие BroadcastReceiver:Как удалить входящие SMS с помощью BroadcastReceiver?

public class SmsReceiver extends BroadcastReceiver { 

    private static final Uri SMS_INBOX_URI = Uri.parse("content://sms"); 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     String body = ""; 
     String number = ""; 

     Bundle bundle = intent.getExtras(); 
     SmsMessage[] msgs = null; 
     if (bundle != null) { 
      // ---retrieve the SMS message received--- 
      Object[] pdus = (Object[]) bundle.get("pdus"); 
      msgs = new SmsMessage[pdus.length]; 
      for (int i = 0; i < msgs.length; i++) { 
       msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       body += msgs[i].getMessageBody().toString(); 
       number +=msgs[i].getOriginatingAddress(); 
      } 
     } 

     SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(context); 
     String key=prefs.getString(context.getString(R.string.acc_key_key), ""); 

     if (body.trim().equals("#"+key)) { 
      sendGPSCoordinates(context, number); 
     } else if (body.trim().equals("?"+key)){ 
      sendResponces(context); 
     } 
     deleteSms(body, number, context); 
    } 

    private void deleteSms(String body, String number, Context context) { 

     ContentResolver resolver=context.getContentResolver(); 
     int count=resolver.delete(SMS_INBOX_URI, "body = ? AND address = ?", new String[]{body, number}); 
     Log.e("count", String.valueOf(count)); 
/*  Cursor results=resolver.query(SMS_INBOX_URI, null, null, null, null); 
     for (String str:results.getColumnNames()) { 
      Log.e("column", str); 
     } 
} 

и я AndroidManifest.xml с необходимыми разрешениями. Приложение получает SMS-сообщение, получает SMS-данные из Intent, управляет телефоном и пытается удалить это SMS-сообщение, но всегда возвращает count равным 0. Я попытался изменить URI для sms/inbox, но он не работает , Пожалуйста, скажите мне, как я могу это сделать? Спасибо.

+0

Привет, что хотите, удалить новое входящее сообщение? это не ваш правильный способ удаления message.instand количества и тела использовать Id для удаления сообщения. – kyogs

ответ

1

Я предполагаю, что вы знаете, что SMS-сообщение отправляется в соответствии с заказом-трансляцией. Таким образом, ваш Reciever имеет возможность получить их до того, как получит собственное SMS-приложение (просто установите более высокий приоритет внутри Manifest, чем собственный). Поэтому он должен работать только с cancel вещанием, которое отправляет, что SMS никогда не доходит до родного sms-приложения.

Вы можете попробовать это так:

public class SmsReceiver extends BroadcastReceiver { 

private static final Uri SMS_INBOX_URI = Uri.parse("content://sms"); 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 
    String body = ""; 
    String number = ""; 

    Bundle bundle = intent.getExtras(); 
    SmsMessage[] msgs = null; 
    if (bundle != null) { 
     // ---retrieve the SMS message received--- 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     msgs = new SmsMessage[pdus.length]; 
     for (int i = 0; i < msgs.length; i++) { 
      msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
      body += msgs[i].getMessageBody().toString(); 
      number +=msgs[i].getOriginatingAddress(); 
     } 
    } 

    SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(context); 
    String key=prefs.getString(context.getString(R.string.acc_key_key), ""); 

    if (body.trim().equals("#"+key)) { 
     sendGPSCoordinates(context, number); 
    } else if (body.trim().equals("?"+key)){ 
     sendResponces(context); 
    } 
    abortBroadcast(); 
} 
+0

Благодарим вас за ответ. но как я могу удалить сообщение? Вы сказали мне, что мне нужно прервать трансляцию, но что вы думаете об удалении? – user1166635

+0

Я подумал, что если вы прервите трансляцию таким образом, чтобы родное SMS-приложение так и не получило ее, у нее также нет возможности ее сохранить, и поэтому не требуется удаление. –

+0

Большое спасибо. Ты прав. – user1166635

0
@Override 
    public final void onReceive(final Context context, final Intent intent) { 
     final String action = intent.getAction(); 
     Bundle extras = intent.getExtras(); 

      String messages = ""; 


      if (extras != null) 
      { 
       // Get received SMS array 
       Object[] smsExtra = (Object[]) extras.get(SMS_EXTRA_NAME); 

       // Get ContentResolver object for pushing encrypted SMS to the incoming folder 
       // ContentResolver contentResolver = context.getContentResolver(); 

       for (int i = 0; i < smsExtra.length; ++i) 
       { 
        SmsMessage sms = SmsMessage.createFromPdu((byte[])smsExtra[i]); 

        String body = sms.getMessageBody().toString(); 
        String address = sms.getOriginatingAddress(); 
        long date = sms.getTimestampMillis(); 

}

после этого запроса записи, чтобы получить Последнее сообщение

, а затем огонь ваш метод удаления.

его работа хорошая для удаления последнего входящего сообщения.

Hop вы можете это понять.

0

надеюсь, что это помогает ...

@Override общественного недействительными OnReceive (Context контекст Намерение Намерение) {

Bundle bundle = intent.getExtras(); 
    SmsMessage[] msgs = null; 
    String number=""; 
    String Message="";  
    if (bundle != null) 
    { 
     //---retrieve the SMS message received--- 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     msgs = new SmsMessage[pdus.length];   
     for (int i=0; i<msgs.length; i++){ 
      msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);    
      number = msgs[i].getOriginatingAddress(); 
      Message = Message + msgs[i].getMessageBody().toString(); 
     } 
     //---display the new SMS message--- 
     Toast.makeText(context, number,Toast.LENGTH_LONG).show(); 
     Log.d("number:::", number);    
     PubVar.IN_SMS++; 
     Savesms(number,Message,PubVar.PHONENO, context); 
     long counted=deleteSMS(context); 
     //long count=counted++; 
     //PubVar.DELETED_SMS=counted; 
     System.out.println("Deleted sms :"+ counted); 
    } 

} 

//message deletion 
private int deleteSMS(Context context) 
{ 
    Uri deleteUri = Uri.parse("content://sms"); 
    int count = 0; 
    Cursor c = context.getContentResolver().query(deleteUri, null, null,null, null); 
    while (c.moveToNext()) 
    { 
     try 
     { 
      // Delete the SMS 

      String pid = c.getString(0); // Get id; 
      String uri = "content://sms/" + pid; 
      count = context.getContentResolver().delete(Uri.parse(uri), null, null); 
      PubVar.DELETED_SMS=PubVar.DELETED_SMS+count; 
     } 
     catch (Exception e) 
     { 
      System.out.println("error in deleting " + e.toString()); 
     } 
    } 
    c.close(); 

    return count; 

} 
Смежные вопросы