2012-06-29 23 views
5

Tôi đang làm việc trên một ứng dụng chặn sms, trong đó tôi đang sử dụng bộ thu phát và phương thức abortBroadcast() - như nhiều ppl đã đề xuất ở đây - để ngăn các thư đến hộp thư đến và cảnh báo người dùng. Nhưng trong trường hợp của tôi, khi tôi gửi tin nhắn bằng trình mô phỏng, tin nhắn SMS sẽ không bị chặn và đến hộp thư đến, tôi cũng gặp lỗi:SMS không thể được ngăn chặn bằng cách sử dụng abortBroadcast()?

06-29 09:19:05.854: E/BroadcastReceiver(868): BroadcastReceiver trying to return result during a non-ordered broadcast 

không chấm dứt ứng dụng trong giả lập, tuy nhiên các ứng dụng được chấm dứt khi tôi kiểm tra nó trên điện thoại của tôi.

Và vâng, tôi đã đặt ưu tiên hàng đầu của người nhận để một số lượng lớn và yêu cầu các điều khoản như bạn thấy ở đây:

<receiver android:name="SMSMonitor"> 
    <intent-filter android:priority="9999999"> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> 
    </intent-filter> 
</receiver> 

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.READ_SMS" /> 
<uses-permission android:name="android.permission.RAISED_THREAD_PRIORITY"/> 

Cuối cùng, đây là mã của tôi:

public class SMSMonitor extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     boolean isOn = loadState(context,"isOn");// is blocking enabled? 
     Bundle bundle = intent.getExtras(); 
     Object messages[] = (Object[]) bundle.get("pdus"); 
     SmsMessage smsMessage[] = new SmsMessage[messages.length]; 
     String mAddress; 
     String mBody; 
     String mTime; 
     if(isOn){ 
      // if spam blocking is enabled. 
      for (int n = 0; n < messages.length; n++) { 
       smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
       mAddress=smsMessage[n].getDisplayOriginatingAddress().toString(); 

       mBody=smsMessage[n].getDisplayMessageBody().toString(); 

       mTime=getTime(); 
       if(isBlackList(mAddress)== true) { 
        this.addLog(mAddress, mBody, mTime); 
        abortBroadcast(); 
        Toast.makeText(context,"Incoming SMS was blocked and logged.", Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    } 
} 

Một số một gợi ý here rằng các chương trình phát SMS không thể bị hủy bỏ vì Android sẽ không cho phép. Nhưng tôi đã thấy nhiều người ở đây đề nghị sử dụng abortBroadcast() để chặn một tin nhắn, và tôi cũng biết một số ứng dụng chặn SMS trên thị trường mà thực sự có thể chặn tin nhắn SMS. Tôi không biết nếu họ đang sử dụng abortbroadcast hay không.

Bất kỳ ý tưởng nào?

+0

Vui lòng Chấp nhận/phiếu bầu tán thành câu trả lời nếu bạn đã có giải pháp của bạn :) –

+0

Tôi nghĩ rằng tôi có câu trả lời, "Tính đến Android 1.6, các chương trình phát sóng tin nhắn SMS đến (android.provider.Telephony.SMS_RECEIVED) được phân phối dưới dạng "phát sóng theo thứ tự" - nghĩa là bạn có thể cho hệ thống biết các thành phần nào sẽ nhận được chương trình phát sóng đầu tiên. " và tôi đang sử dụng Android 1.5 Và chương trình phát sóng không được đặt hàng! Nhờ anh chàng này ở đây [link] (http://stackoverflow.com/questions/419184/how-to-delete-an-sms-from-the-inbox-in-android-programmatically) – Wise

Trả lời

1

"Kể từ Android 1.6, chương trình phát sóng tin nhắn SMS đến (android.provider.Telephony.SMS_RECEIVED) được phân phối dưới dạng" phát sóng theo thứ tự "- nghĩa là bạn có thể cho hệ thống biết thành phần nào sẽ được phát sóng trước." và tôi đang sử dụng Android 1.5 Và chương trình phát sóng không được đặt hàng!

Nhờ anh chàng này ở đây link

2

Chắc chắn bạn có thể làm này, mã mà bạn đã viết là hoàn toàn tốt đẹp,

Cố gắng ưu tiên changin <intent-filter android:priority="9999999">-<intent-filter android:priority="99999999">, về cơ bản ưu tiên cao hơn sau đó những gì bạn đã đưa ra, sau đó cố gắng để kiểm tra.

+0

Cảm ơn bạn đã trả lời nhưng điều đó dường như không giúp được gì. Và tôi đoán nếu ứng dụng của tôi bỏ lỡ chương trình phát sóng, sẽ không có lỗi nào xảy ra, chỉ cần thông báo. Tôi nghĩ rằng có sự cố liên quan đến các chương trình phát sóng được đặt hàng hoặc không được sắp xếp. – Wise

+0

'Thread.currentThread(). SetPriority (Thread.MAX_PRIORITY);' –

1

Có hiển thị bánh mì nướng từ người nhận không? Có lẽ Người nhận của bạn không được đăng ký đúng trong Tệp kê khai.

cố gắng thay đổi,

<receiver android:name="SMSMonitor"> 

để

<receiver android:name=".SMSMonitor"> 
Các vấn đề liên quan