android 监控来电(草稿)
思路:
对来电进行监控
1)对于通讯录的电话来电不做监控
2)对于通讯录里没有的电话号码进行监控
监控规则:
1)正则匹配 如:杭州的本地号码需要接听 其他地区来电拒接
2)如果一些确认需要来电的号码但又不想加入黑名单的号码 加入白名单管理列表;
3)如果是手机来电,拒接的发送一条短信(询问是何人找我干什么事情?避免误伤),如果是座机就误伤吧!
android 官方教程http://developer.android.com/training/basics/firstapp/building-ui.html
https://gist.github.com/CyanogenMod/android_frameworks_base/tree/cf4550c3198d6b3d92cdc52707fe70d7cc0caa9f
—————————————分隔线——————————
下面是收集的一些代码片段:
public class PhoneStatReceiver extends BroadcastReceiver{
private static final String TAG = "PhoneStatReceiver";
// private static MyPhoneStateListener phoneListener = new MyPhoneStateListener();
private static boolean incomingFlag = false;
private static String incoming_number = null;
@Override
public void onReceive(Context context, Intent intent) {
//如果是拨打电话
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
incomingFlag = false;
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i(TAG, "call OUT:"+phoneNumber);
}else{ //action.equals(MyBroadcastReceiver.B_PHONE_STATE)
//如果是来电
TelephonyManager tm =
(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
switch (tm.getCallState()) {
case TelephonyManager.CALL_STATE_RINGING:
incomingFlag = true;//标识当前是来电
incoming_number = intent.getStringExtra("incoming_number");
if (isBlock(incoming_number)) {
try {
Method method = Class.forName(
"android.os.ServiceManager").getMethod(
"getService", String.class);
// 获取远程TELEPHONY_SERVICE的IBinder对象的代理
IBinder binder = (IBinder) method.invoke(null,
new Object[] { TELEPHONY_SERVICE });
// 将IBinder对象的代理转换为ITelephony对象
ITelephony telephony = ITelephony.Stub
.asInterface(binder);
// 挂断电话
telephony.endCall();
} catch (Exception e) {
e.printStackTrace();
}
}
Log.i(TAG, "RINGING :"+ incoming_number);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
if(incomingFlag){
Log.i(TAG, "incoming ACCEPT :"+ incoming_number);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if(incomingFlag){
Log.i(TAG, "incoming IDLE");
}
break;
}
}
}
}
在AndroidManifest.xml,配置写好的Receiver,并拦截相应的BroadCastAction,
另外注意加上相应的权限。
<receiver android:name=".filter.PhoneStatReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
来电分三种状态:
CALL_STATE_RINGING:来电响铃
CALL_STATE_OFFHOOK:摘机
CALL_STATE_IDLE:挂机
http://blog.csdn.net/lee576/article/details/8053387
http://wenku.baidu.com/view/f391162e453610661ed9f4b1.html
private static final String[] PHONES_PROJECTION = new String[] {
Phone.DISPLAY_NAME, Phone.NUMBER, Photo.PHOTO_ID,Phone.CONTACT_ID };
/**得到手机通讯录联系人信息**/
private void getPhoneContacts() {
ContentResolver resolver = mContext.getContentResolver();
// 获取手机联系人
Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null);
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
//得到手机号码
String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);
//当手机号码为空的或者为空字段 跳过当前循环
if (TextUtils.isEmpty(phoneNumber))
continue;
//得到联系人名称
String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);
//得到联系人ID
Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);
//得到联系人头像ID
Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);
//得到联系人头像Bitamp
Bitmap contactPhoto = null;
//photoid 大于0 表示联系人有头像 如果没有给此人设置头像则给他一个默认的
if(photoid > 0 ) {
Uri uri =ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri);
contactPhoto = BitmapFactory.decodeStream(input);
}else {
contactPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.contact_photo);
}
mContactsName.add(contactName);
mContactsNumber.add(phoneNumber);
mContactsPhonto.add(contactPhoto);
}
phoneCursor.close();
}
}
private Cursor getContacts(){
// Run query
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
};
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +
(mShowInvisible ? "0" : "1") + "'";
String[] selectionArgs = null;
//sort ordering based on localized preferences(sqlite排序用法:根据本地化设置对字符串进行比较排序)
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
}
android 监控来电(草稿)相关推荐
- android监控来电显示
当电话来电的时候,我们要监控着电话号码的来电,哪我们是通过代码控制,下面我们看看利用吐丝显示来电显示 package com.smart; import android.app.Activity; ...
- android 来电显示号码,android监控来电显示
原理:电话预订功能,需要显示来电者的电话号码,c#实现获取电话号码,并在应用程序中显示出来.将电话机通过支持来电显示的moderm或USB来电显示盒(来电宝)与电话线连接,即可实现来电显示功能. 为了 ...
- Android 号码, 来电归属地 Jni 使用C++对二进制文件查询(一) 理论篇
1.效果图 左边的是应用程序界面,只是做个测试.右边的是应用程序信息,你会发现数据这块很小,只有420KB,要知道里面有近280,000记录. 2.尝试使用sqlite数据库, 用db格式文件. 随便 ...
- android 来电过滤,Android实现来电挂断
Android实现来电挂断要注意区分系统版本 Android 9.0 以后使用TelecomManager (需要权限Manifest.permission.ANSWER_PHONE_CALLS). ...
- Android实现来电和去电的监听
写个实例实现Android中来电和去电的监听,来电可以使用PhoneStateListener对电话状态的改变进行监听,去电需要动态或者静态去注册广播接收器,对去电进行监听: 来电: 来电所对应的三种 ...
- android 模拟来电广播,在Android模拟器上模拟来电
最近项目要做一个控制来电显示的Android 应用 需要在Emulator上模拟来电 效果 方法如下: 1.单个电话 打开命令行cmd,输入telnet 回车. 然后输入 o localhost 55 ...
- android监控方法耗时开源库,【开源完整项目】 AndroidGodEye 监控Android数据指标
AndroidGodEye Android开发者在性能检测方面的工具一直比较匮乏,仅有的一些工具,比如Android Device Monitor,使用起来也有些繁琐,使用起来对开发者有一定的要求.而 ...
- android监控io产生的应用,Android IO性能分析及排查
概述 Android得IO问题实际上就是探究Linux得IO问题. 本文主要是总结了网上各路大神得经验,写了一些实际操作中遇到得问题和解决方案. 最近在搞性能优化方面得研究,研究使用Soloπ得io占 ...
- android 监控app 读写,Android端 APP性能监控实践
如今大部分的APP测试工作关注点主要集中在功能的逻辑与交互上,由于各种原因(比如测试时间不够,测试手段有限等等),对APP客户端的性能数据往往比较忽视,然而经过移动互联网爆发式发展后,许多App功能差 ...
最新文章
- “应付”大学作业,我花3小时写了一个“文本转手写”神器
- Java NIO之Selector(选择器)
- 求和函数sumx_PowerBI公式-SUMX 函数
- 阿里代码规范检测工具-eclipse
- pta查验身份证。个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。
- 全国计算机软件专业二本大学排名,2017全国二本大学专业排名
- H3CNE V7.0 视频教程
- pikachu靶场学习1
- oracle入门操作3(关于查询 )
- 树莓派3b+串口配置
- Java并发工具辅助类代码实例
- Python ORM框架peewee
- 安卓flash插件_Flash 终将谢幕:微软将于年底停止对 Flash 的支持
- 已知坐标增量求坐标方位角_桥梁桩基坐标计算原理
- 如何看到laravel的版本号
- 简单的java单位换算_Java实现蓝桥杯单位转换
- lg linux电视安装软件,LG电视无法安装第三方软件?当贝市场分享的LG安装当贝市场教程...
- PHP语法基础2.1
- 代码精进之路-命名与规范
- 半条命2服务器无响应,半条命2常见问题汇总_半条命2常见问题解决_快吧单机游戏...
热门文章
- 使用visio创建跨职能流程图。
- JavaBean简单应用,输入三边长判断能否构成三角形并输出三角形面积
- Simulink自动代码生成:原子子系统(Atomic Subsystem)
- 瀑布模型和敏捷开发模型
- Spring常见问题解决 - AOP调用被拦截类的属性报NPE
- vr体验馆项目_如今VR体验店有哪些项目,需要有哪些VR设备
- 程序员以为警察不懂技术删代码,民警亮出学历,程序员懵了;4月数据库流行度排行榜;曝雷军接待王传福;VS Code 1.55...
- 第五人格维修服务器中要不要玩,常玩第五人格的人,不要直接打王者,第五后遗症帮你一路上青铜...
- JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点
- Jenkins 运行任务时遇到 FATAL:Unable to produce a script file 报错(已解决)