2012-05-22 2 views
0

저는 SMS 명령을 사용하여 장치를 관리 할 수있는 응용 프로그램을 개발해 왔습니다. 응용 프로그램은 SMS에서 명령을 실행하고이 Sms를 삭제해야합니다. 따라서 관리 코드는 작동하지만 SMS를 삭제할 수는 없습니다. 나는 BroadcastReceiver를 따르고있다 :BroadcastReceiver를 사용하여 들어오는 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); 
     } 
     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 데이터를 가져 와서 전화를 관리하며이 SMS를 삭제하려고 시도하지만 항상 카운트는 0과 같습니다. SMS /받은 편지함의 URI를 변경하려고 시도했지만 작동하지 않습니다 . 제발, 말해 봐요, 어떻게해야합니까? 고맙습니다. 이 쓰기 쿼리 후

+0

안녕하세요. 새 메시지를 삭제 하시겠습니까? 이것은 메시지를 삭제하기 위해 번호와 본문 ID의 message.instand를 삭제하는 올바른 방법이 아닙니다. – kyogs

답변

1

SMS 메시지가 주문형 브로드 캐스트로 전송된다고 가정합니다. 그래서 당신의 Reciever는 네이티브 SMS-app가 그것을 얻을 수 있기 전에 그들을 얻을 수있는 능력을 가지고 있습니다. 그러므로 그것은 단지 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

브로드 캐스트를 네이티브 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(); 

}

는 마지막 메시지를

를 얻을 다음 삭제 방법을 발사합니다.

마지막 수신 메시지를 삭제하는 것이 좋습니다.

홉 당신은 그것을 이해할 수 있습니다.

0

희망 ...

@Override 공공 무효 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; 

} 
관련 문제