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
- Android电话监听与短信监听
- android 短信,电话监听广播
- 短信的监听与电话的呼出的监听
- Android电话及短信的监听程序源码
- Android中监听电话接听拨打、收发短信的实例
- Android开发之电话服务、SMS短信监听
- Android 电话监听
- Ohone/android 监听电话
- android 之电话监听
- Android-电话监听工具
- android 实现监听电话
- Android监听电话状态
- android 监听电话状态
- android 监听电话状态
- android 监听电话状态
- Android 电话状态监听
- 【Android】监听电话状态
- android电话状态监听
- iOS笔记--oc语法6 (OC中有私有变量和私有方法的相关讨论)
- hdu 3666 THE MATRIX PROBLEM
- wpf工程中在Xaml文件下添加多个cs文件
- 第十二周项目1 图基本算法库
- Android高效获取指定类型文件,获取文件不求人!
- Android电话监听与短信监听
- 回溯法Matrix
- 最大似然估计学习总结------MadTurtle 1. 作用 在已知试验结果(即是样本)的情况下,用来估计满足这些样本分布的参数,把可能性最大的那个参数clip_image002作为真实cl
- dfs ancient go
- 全对偶测试法1
- 再来一发迪杰斯特拉最短路。HDU2112
- 黑马程序员--面向对象(day05)
- Redis 集群规范(中文稿)(MOVED错误码及ASK错误码
- 在子线程中使用runloop,正确操作NSTimer计时的注意点 三种可选方法