Android电话监听与短信监听

来源:互联网 发布:iphone蜂窝数据快捷键 编辑:程序博客网 时间:2024/06/05 12:47

一、电话监听的两种方式

1、使用PhoneStateListener进行电话监听

/**  *   * @description  通过该实例,我们可以看到,如果我们想要监听电话的拨打状况,需要这么几步  * 第一:获取电话服务管理器TelephonyManager manager = this.getSystemService(TELEPHONY_SERVICE);  * 第二:通过TelephonyManager注册我们要监听的电话状态改变事件。manager.listen(new MyPhoneStateListener(),  *       PhoneStateListener.LISTEN_CALL_STATE);这里的PhoneStateListener.LISTEN_CALL_STATE就是我们想要  *      监听的状态改变事件,初次之外,还有很多其他事件哦。  * 第三步:通过extends PhoneStateListener来定制自己的规则。将其对象传递给第二步作为参数  * 第四步:这一步很重要,那就是给应用添加权限。android.permission.READ_PHONE_STATE  *   *  */  public class PhoneCallStateActivity extends Activity  {      TelephonyManager manager ;      String result = "监听电话状态:/n";       TextView textView ;      @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          //获取电话服务          manager = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);          // 手动注册对PhoneStateListener中的listen_call_state状态进行监听          manager.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);          textView  = (TextView) findViewById(R.id.textView1);          textView.setText(result);      }     /***     * 继承PhoneStateListener类,我们可以重新其内部的各种监听方法     *然后通过手机状态改变时,系统自动触发这些方法来实现我们想要的功能     */      class MyPhoneStateListener extends PhoneStateListener{          @Override          public void onCallStateChanged(int state, String incomingNumber) {              switch (state) {              case TelephonyManager.CALL_STATE_IDLE:                  result+=" 手机空闲起来了  ";                  break;              case TelephonyManager.CALL_STATE_RINGING:                  result+="  手机铃声响了,来电号码:"+incomingNumber;                  break;              case TelephonyManager.CALL_STATE_OFFHOOK:                  result+=" 电话被挂起了 ";              default:                  break;              }              textView.setText(result);              super.onCallStateChanged(state, incomingNumber);          }      }  }  

2、使用广播实现电话的监听

public class PhoneBroadcastReceiver extends BroadcastReceiver {    private static final String TAG = "message";    private static boolean mIncomingFlag = false;    private static String mIncomingNumber = null;    @Override    public void onReceive(Context context, Intent intent) {        // 如果是拨打电话        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {            mIncomingFlag = false;            String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);            Log.i(TAG, "call OUT:" + phoneNumber);        } else {            // 如果是来电            TelephonyManager tManager = (TelephonyManager) context                    .getSystemService(Service.TELEPHONY_SERVICE);            switch (tManager.getCallState()) {            case TelephonyManager.CALL_STATE_RINGING:                mIncomingNumber = intent.getStringExtra("incoming_number");                Log.i(TAG, "RINGING :" + mIncomingNumber);                break;            case TelephonyManager.CALL_STATE_OFFHOOK:                if (mIncomingFlag) {                    Log.i(TAG, "incoming ACCEPT :" + mIncomingNumber);                }                break;            case TelephonyManager.CALL_STATE_IDLE:                if (mIncomingFlag) {                    Log.i(TAG, "incoming IDLE");                }                break;            }        }    }}

二、短信监听的两种方式

1、通过广播监听短信消息

public class SMSReceiver extends BroadcastReceiver {    public static final String TAG = "ImiChatSMSReceiver";    //android.provider.Telephony.Sms.Intents    public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";    @Override    public void onReceive(Context context, Intent intent) {       if (intent.getAction().equals(SMS_RECEIVED_ACTION)) {           SmsMessage[] messages = getMessagesFromIntent(intent);           for (SmsMessage message : messages) {              Log.i(TAG, message.getOriginatingAddress() + " : " +                  message.getDisplayOriginatingAddress() + " : " +                  message.getDisplayMessageBody() + " : " +                  message.getTimestampMillis());           }       }    }    public final SmsMessage[] getMessagesFromIntent(Intent intent) {        Object[] messages = (Object[]) intent.getSerializableExtra("pdus");        byte[][] pduObjs = new byte[messages.length][];        for (int i = 0; i < messages.length; i++) {            pduObjs[i] = (byte[]) messages[i];        }        byte[][] pdus = new byte[pduObjs.length][];        int pduCount = pdus.length;        SmsMessage[] msgs = new SmsMessage[pduCount];        for (int i = 0; i < pduCount; i++) {            pdus[i] = pduObjs[i];            msgs[i] = SmsMessage.createFromPdu(pdus[i]);        }        return msgs;    }}

2、基于ContentObserver监听短信

我们可以知道ContentObserver可以获取Uri引起的数据库的变化,短信的Uri为:

发送短信:content://sms/outbox

接收短信:content://sms/inbox

知道Uri后我们就可以获取到短信的内容了。

(1)实现的方法就是重载ContentObserver.onChange()方法

private class SmsObserver extends ContentObserver {    public SmsObserver(Handler handler) {        super(handler);        // TODO Auto-generated constructor stub    }    @Override    public void onChange(boolean selfChange) {        // TODO Auto-generated method stub                    //查询发送箱中的短信(正在发送中的短信放在发送箱中)        Cursor cursor = getContentResolver().query(                Uri.parse("content://sms/outbox"), null, null, null, null);        while(cursor.moveToNext()){            StringBuilder sb = new StringBuilder();            sb.append("address="+cursor.getString(cursor.getColumnIndex("address")));            sb.append(", body="+cursor.getString(cursor.getColumnIndex("body")));            sb.append(", date="+cursor.getString(cursor.getColumnIndex("date")));            Log.i("Observer", sb.toString());        }        cursor.close();        super.onChange(selfChange);    }}

(2)注册Listener

getContentResolver().registerContentObserver(                Uri.parse("content://sms"), true, new SmsObserver(new Handler()));

(3)设置权限

要接收某些action,需要在AndroidManifest.xml里面添加相应的权限。

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 

参考文章:

android之通过phoneStateListener监听电话状态改变

Android广播接实现电话的监听(电话的状态,拦截)

Android手机上监听短信的两种方式

Android 监听短信2种方式:Broadcast和ContentObserver

0 0
原创粉丝点击