2012-05-22 31 views
0

我一直在開發可以使用SMS命令管理設備的應用程序;該應用程序必須執行來自SMS的命令並刪除該Sms。所以,管理作品的代碼,但我無法刪除短信。我有以下的BroadcastReceiver:如何使用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具有所需的權限。應用程序收到短信,從意圖獲取短信數據,管理手機,並試圖刪除此短信,但它總是返回計數是等於0.我試圖更改短信/收件箱的URI,但它不起作用。請告訴我,我該怎麼做?謝謝。

+0

你好。你想要什麼?刪除新的傳入消息?這不是你正確的方法來刪除message.instand的號碼和身體使用Id來刪除消息。 – kyogs

回答

1

我假設,你知道,SMS消息是作爲有序廣播發送的。因此,您的Reciever能夠在本地短信應用程序獲取之前獲得它們(只需在本機內部設置比Manifest更高的優先級)。因此,它應該只發送正在發送的廣播cancel,即SMS不會到達本機sms-app。

你可以嘗試這樣的:

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

我想,如果以原生短信應用程序永遠不會收到它的方式中止廣播,它也沒有機會保存它,因此不需要刪除 –

+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(); 

}

此寫入查詢後得到最後消息

,然後解僱你的刪除方法。

其工作良好刪除最後傳入的消息。

你可以理解它。

0

希望這可以幫助你......

@覆蓋 公共無效的onReceive(上下文語境,意圖意圖) {

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; 

}