Tôi biết câu hỏi này đã được hỏi nhiều lần, nhưng không ai có thể đưa ra câu trả lời làm việc từ những gì tôi đã thấy.Sms ContentObserver onChange() cháy nhiều lần
Im làm việc trên ứng dụng để chặn tin nhắn văn bản và tùy thuộc vào số lần gửi #, bật lên bằng cảnh báo tùy chỉnh. Tôi có nó làm việc tốt đẹp với một máy thu phát sóng, tuy nhiên nếu người dùng đã goSms cài đặt các phương pháp onReceive()
không bao giờ được gọi là goSms hủy bỏ nó trước khi nó đến ứng dụng của tôi.
Để giải quyết vấn đề này, hãy thử người quan sát nội dung theo số content://sms/
Chỉ hoạt động tốt, tuy nhiên, onChange()
được gọi hai lần, với chính xác cùng thông số. Ive đã cố gắng kiểm tra tem thời gian, nhưng chúng giống nhau, cũng như kiểu và mọi tham số khác tôi đã đặt.
Từ những gì tôi đã thấy, đây là vấn đề phổ biến, nhưng không phải là vấn đề mà tôi đã thấy được trả lời ở bất kỳ đâu.
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
querySMS();
}
protected void querySMS() {
Cursor cur = getContentResolver().query(u, null, null, null, null);
cur.moveToNext(); // this will make it point to the first record, which is the last SMS sent
String type = cur.getString(cur.getColumnIndex("type"));
String body = cur.getString(cur.getColumnIndex("body")); //content of sms
String add = cur.getString(cur.getColumnIndex("address")); //phone num
if (type.equals("1")) {
if (add.equals(Test.SENDER)) {
String[] bodys = body.split(" ", 7);
if (bodys[0].equals("test")) {
test = true;
}
cat = bodys[1];
level = bodys[2];
urgency = bodys[3];
certainty = bodys[4];
carrier = bodys[5];
message = bodys[6];
final Intent intent = new Intent(context, AlertActivity.class);
Bundle b = new Bundle();
b.putString("title", cat);
b.putString("certainty", certainty);
b.putString("urgency", urgency);
b.putString("level", level);
b.putString("message", message);
b.putBoolean("test", test);
intent.putExtras(b);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
carrierName = manager.getNetworkOperatorName();
if (carrierName.replaceAll(" ", "").equals(carrier)) {
context.startActivity(intent);
} else {
//testing
Toast.makeText(context, carrierName.replaceAll(" ", ""), Toast.LENGTH_LONG).show();
}
}
}
}
Vì số onChange()
bị hủy hai lần, tôi cũng nhận được hai cảnh báo. Tôi không thể cho cuộc sống của tôi tìm ra một cách xung quanh điều này.
liên kết đến câu trả lời khác (không đầy đủ) sẽ hữu ích – KevinDTimm