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;

    };

}

在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-permissionandroid: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
原创粉丝点击