2012-05-31 45 views
6

Tôi đã tìm kiếm khá một chút trên diễn đàn để xác định có bao nhiêu tin nhắn SMS tôi có mà không được đọc. Đoạn mã dưới đây có vẻ hoạt động tốt cho các tin nhắn nhận được, nhưng một khi tôi thực sự đọc thông báo thì onChange của ContentObserver không được gọi. Vì vậy, trên tin nhắn SMS đến, onChange được gọi và tôi nhận được số chính xác, nhưng sau khi đọc tin nhắn nó không được gọi là. Thiết bị này là Samsung Note chạy Android 2.3.6 không bắt nguồn từ. Bất kỳ trợ giúp sẽ được đánh giá cao.onChange phương thức của ContentObserver không được gọi khi tin nhắn SMS được đọc trên Android

public class UnreadSMSContentObserver extends ContentObserver { 
    private static final String myTAG="PhoneInfoSMS"; 
    private static final Uri SMS_INBOX = Uri.parse("content://sms/inbox"); 

    private ContentResolver mContentResolver; 
    private Handler mHandler; 
    public int unreadSMS; 
    private static final String TAG = "PhoneInfoSMS"; 

    public UnreadSMSContentObserver(ContentResolver cr, Handler h) { 
     super(null); 
     mContentResolver = cr; 
     mHandler = h; 
    } 

    public int getUnreadSMS() { 
     if (mContentResolver != null) { 
      try { 
       Cursor c = mContentResolver.query(SMS_INBOX, null, "read = 0", null, null); 
       if (c != null) { 
        unreadSMS = c.getCount(); 
        c.deactivate(); 
        Log.d(TAG, unreadSMS + " unread SMS messages"); 
        } 
       } 
      catch (Exception ex) { 
       Log.e("ERROR: " + ex.toString(), ""); 
      } 
     } 
     return unreadSMS; 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     Log.d(myTAG, "onChange"); 
     if (mContentResolver != null) { 
      getUnreadSMS(); 
      mHandler.obtainMessage(PhoneInfoServer.CONTENTO_INFOCHANGED, PhoneInfoServer.CONTENTO_US, unreadSMS).sendToTarget(); 
      Log.d(myTAG, "done"); 
     } 
    } 
} 

Trong file manifest tôi có các điều khoản sau đây:

"android.permission.READ_CONTACTS" 
"android.permission.READ_SMS" 
"android.permission.GET_ACCOUNTS" 
"android.permission.BATTERY_STATS" 
"android.permission.BLUETOOTH" 
"android.permission.BLUETOOTH_ADMIN" 
"android.permission.BROADCAST_SMS" 
"android.permission.RECEIVE_SMS" 
"android.permission.BROADCAST_SMS" 
"android.permission.RECEIVE_MMS" 

Con đường tôi đặt nó lên trên các dịch vụ gọi điện thoại là: trong onCreate của dịch vụ tôi làm:

mContentResolver = this.getContentResolver(); 
mUnreadSMSContentObserver = new UnreadSMSContentObserver(mContentResolver, mContentObserversHandler); 

trong onStartCommand của dịch vụ tôi làm:

mContentResolver.registerContentObserver(Uri.parse("content://sms/"), true, mUnreadSMSContentObserver);    
mContentResolver.registerContentObserver(Uri.parse("content://sms/inbox/"), true, mUnreadSMSContentObserver); 

Tôi chỉ thử nội dung: // sms/và chỉ nội dung: // sms/inbox/và cả hai ... không giải quyết được vấn đề.

P.S. Phương pháp tương tự cho các cuộc gọi nhỡ hoạt động hoàn hảo!

Ứng dụng + dịch vụ gửi qua Bluetooth dữ liệu pin, cuộc gọi nhỡ và tin nhắn SMS chưa đọc tới thiết bị dựa trên Arduino hiển thị trên màn hình LED. Tại sao? Hai lý do: đầu tiên, đây là chương trình Android đầu tiên của tôi được thực hiện cho vui. Thứ hai là tôi không mang theo điện thoại ở nhà mọi lúc, và nó thường ở văn phòng nhà tôi. Nếu tôi không nghe thấy tiếng chuông, tôi vẫn có thể nhìn thấy màn hình LED cho biết tôi đã có cuộc gọi hoặc SMS khi đi qua.

+0

nên không được gọi siêu (h), chứ không phải siêu (null)? – matt5784

Trả lời

1

giải pháp này đã làm việc cho tôi:

context.getContentResolver(). 
       registerContentObserver(Uri.parse("content://mms-sms/"), true, smsObserver); 
+0

Nó làm việc cho tôi! – sandy

Các vấn đề liên quan