本文实例展示了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程序开发能起到一点参考借鉴作用。