Android 未接来电及未读短彩信的监听实现

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-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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值