Android 未接来电及未读短彩信的监听实现
来源:互联网 发布:陈冠希道歉 知乎 编辑:程序博客网 时间:2024/05/21 17:54
public class PhoneConstants {
/**
* The phone state. One of the following:<p>
* <ul>
* <li>IDLE = no phone activity</li>
* <li>RINGING = a phone call is ringing or call waiting.
* In the latter case, another call is active as well</li>
* <li>OFFHOOK = The phone is off hook. At least one call
* exists that is dialing, active or holding and no calls are
* ringing or waiting.</li>
* </ul>
*/
public enum State {
IDLE, RINGING, OFFHOOK;
监听电话状态的广播 TelephonyManager.ACTION_PHONE_STATE_CHANGED =
最后添加权限
三:监听未读短彩信的数量
/**
* The phone state. One of the following:<p>
* <ul>
* <li>IDLE = no phone activity</li>
* <li>RINGING = a phone call is ringing or call waiting.
* In the latter case, another call is active as well</li>
* <li>OFFHOOK = The phone is off hook. At least one call
* exists that is dialing, active or holding and no calls are
* ringing or waiting.</li>
* </ul>
*/
public enum State {
IDLE, RINGING, OFFHOOK;
};
}
在PhoneConstants中只有三种状态,详细解释可见注释。
对于未接来电,可以认为本次状态是idle,上次状态是ringing。
具体实现如下:
public class CallListener extends PhoneStateListener {private static final String TAG = "sms";private static int lastetState = TelephonyManager.CALL_STATE_IDLE; //最后的状态private Context context;public CallListener(Context context) {super();this.context = context;}public void onCallStateChanged(int state, String incomingNumber) {Log.v(TAG, "CallListener call state changed : " + incomingNumber);String m = null;// 如果当前状态为空闲,上次状态为响铃中的话,则认为是未接来电if(lastetState == TelephonyManager.CALL_STATE_RINGING&& state == TelephonyManager.CALL_STATE_IDLE){sendSmgWhenMissedCall(incomingNumber);}//最后改变当前值lastetState = state;}private void sendSmgWhenMissedCall(String incomingNumber) {//未接来电处理(发短信,发email等)}}
监听电话状态的广播 TelephonyManager.ACTION_PHONE_STATE_CHANGED =
android.intent.action.PHONE_STATE
;public class CallReceiver extends BroadcastReceiver{public void onReceive(Context context, Intent intent) {Log.i("sms", "CallReceiver Start...");TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);CallListener customPhoneListener = new CallListener(context);telephony.listen(customPhoneListener,PhoneStateListener.LISTEN_CALL_STATE);Bundle bundle = intent.getExtras();String phoneNr = bundle.getString("incoming_number");Log.i("sms", "CallReceiver Phone Number : " + phoneNr);}}
最后添加权限
<
uses-permission
android:name
=
"android.permission.READ_PHONE_STATE"
/>
二: 监听未接来电的数量
未接来电不能用 Observer监听,不过当有新的未接来电时,系统会发送一个广播com.android.phone.NotificationMgr.MissedCall_intent(锁屏上显示的未接来电数量就是通知监听这个广播实现的)
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);
广播只是当有新的未接来电时才会发送,但是如果有旧的未接来电没有读取时,上面的广播就得不到数据了,那就必须得从数据库中查找了
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;}
三:监听未读短彩信的数量
首先注册Observer,当有新短信或彩信来的时候会调用 onChange方法,我们可以在onChange方法中去获取未读短信和彩信,然后做一些UI上的处理!
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"); }}
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;}
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;}
0 0
- Android 未接来电及未读短彩信的监听实现
- Android监听未接来电
- android来电监听功能的实现
- 监听未接来电,自动回复短信
- Android实现来电和去电的监听
- Android中监听手机来电及状态
- 清除未接来电及通知
- Android有未接来电后处理(判断未接来电)
- Android有未接来电后处理(判断未接来电)
- android 拨打电话、 监听来电、监听呼出电话的功能实现
- 来电监听及录音
- Android来电监听,正确的写法
- Android之来电状态的监听
- Android获取未接来电失败
- Android获取未接来电失败
- Android来电监听
- android 手机来电监听
- Android中监听来电
- C#:总结记录2014-11
- 水电费的所发生的
- 的风格的风格
- js html双向绑定Demo
- Liblinear使用
- Android 未接来电及未读短彩信的监听实现
- 实现c++类的多重继承
- QSettings读写注册表和ini文件
- 下拉菜单隐藏箭头
- Symmetric Tree-LeetCode
- 密码框提示文字
- C++默认参数
- oracle表空间查询维护命令大全之三(临时表空间)史上最全
- java.lang.ClassNotFoundException: org.apache.commons.pool.KeyedObjectPoolFactory解决方案