Android实现获取未接来电和未读短信数量的方法

时间:2022-01-10 16:01:45

本文实例展示了Android实现获取未接来电和未读短信数量的方法,在Android程序开发中非常常见,是非常实用的功能,现分享给大家供大家参考。具体如下:

一、未读短信
 
首先注册Observer,当有新短信或彩信来的时候会调用 onChange方法,我们可以在onChange方法中去获取未读短信和彩信,然后做一些UI上的处理!

具体功能代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private ContentObserver newMmsContentObserver = new ContentObserver(new Handler()) {
  public void onChange(boolean selfChange) {
    int mNewSmsCount = getNewSmsCount() + getNewMmsCount();
  }
};
private void registerObserver() {
  unregisterObserver();
  getContentResolver().registerContentObserver(Uri.parse("content://sms"), true,
      newMmsContentObserver);
  getContentResolver().registerContentObserver(MmsSms.CONTENT_URI, true,
      newMmsContentObserver);
}
private synchronized void unregisterObserver() {
  try {
    if (newMmsContentObserver != null) {
      getContentResolver().unregisterContentObserver(newMmsContentObserver);
    }
    if (newMmsContentObserver != null) {
      getContentResolver().unregisterContentObserver(newMmsContentObserver);
    }
  } catch (Exception e) {
    Log.e(TAG, "unregisterObserver fail");
  }
}

得到未读短信数量:

?
1
2
3
4
5
6
7
8
9
10
private int getNewSmsCount() {
  int result = 0;
  Cursor csr = getContentResolver().query(Uri.parse("content://sms"), null,
      "type = 1 and read = 0", null, null);
  if (csr != null) {
    result = csr.getCount();
    csr.close();
  }
  return result;
}

获取未读彩信数量:

?
1
2
3
4
5
6
7
8
9
10
private int getNewMmsCount() {
  int result = 0;
  Cursor csr = getContentResolver().query(Uri.parse("content://mms/inbox"),
      null, "read = 0", null, null);
  if (csr != null) {
    result = csr.getCount();
    csr.close();
  }
  return result;
}

二、未接来电

未接来电不能用 Observer监听,不过当有新的未接来电时,系统会发送一个广播com.android.phone.NotificationMgr.MissedCall_intent(锁屏上显示的未接来电数量就是通知监听这个广播实现的)

具体功能代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
final IntentFilter filter = new IntentFilter();
filter.addAction("com.android.phone.NotificationMgr.MissedCall_intent");
final Application application = getApplication();
application.registerReceiver(new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (action != null && "com.android.phone.NotificationMgr.MissedCall_intent".equals(action)) {
      int mMissCallCount = intent.getExtras().getInt("MissedCallNumber");
    }
  }
}, filter);

广播只是当有新的未接来电时才会发送,但是如果有旧的未接来电没有读取时,上面的广播就得不到数据了,那就必须得从数据库中查找了。

功能代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private int readMissCall() {
  int result = 0;
  Cursor cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, new String[] {
      Calls.TYPE
    }, " type=? and new=?", new String[] {
        Calls.MISSED_TYPE + "", "1"
    }, "date desc");
 
  if (cursor != null) {
    result = cursor.getCount();
    cursor.close();
  }
  return result;
}

相信本文所述实例对于大家的Android程序开发能起到一点参考借鉴作用。