android 监控来电(草稿)

本文详细介绍了如何使用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.youkuaiyun.com/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); 
        } 

抖音《软件测试技术》报告 1.实践目的 (1)理解软件测试的基本概念:使学生了解软件测试在软件开发过程中的重要性。 (2)掌握软件测试的基本方法和技术:课程会介绍各种测试方法,等价类划分、边界值分析法等,以及相应的测试技术,黑盒测试、白盒测试等。学生需要理解这些方法和技术的原理,并能够在实际项目中应用。 (3)培养测试用例设计和编写能力:测试用例是软件测试的核心,课程会教授如何编写有效的测试用例,学生通过软件测试来掌握测试用例的编写,使学生能够在实际工作中正确编写测试用例。 (4)学习使用测试工具:现代软件测试依赖于各种测试工具。课程会介绍这些工具的基本功能和操作方法,学生通过软件测试来掌握这些方法,使学生能够在实际工作中高效地使用它们。 (5)培养问题解决和团队协作能力:软件测试过程中会遇到各种问题,学生需要学会分析问题、寻找解决方案。培养学生的问题解决能力。 2.实践内容 3.项目分析与测试设计 3.1项目分析 (明确测试目标: 确保产品的各项功能正常运行并符合用户需求。 验证产品的性能是否满足用户预期的响应时间和负载能力。 识别和消除产品中的潜在缺陷,提高产品的稳定性和可靠性。 需求理解与分析: 深入理解项目的功能需求、性能需求、安全需求等,确保对需求有全面而准确的理解。 分析需求文档,挖掘可能存在的隐性需求,确保测试覆盖的全面性。 项目环境: 了解项目的运行环境,包括硬件环境、软件环境、网络环境等。 分析项目的用户情况,如用户数量、用户类型、用户行为等。 风险评估: 识别测试过程中可能遇到的风险,如技术风险、时间风险、资源风险等。 评估风险的影响程度和可能性,制定风险应对策略。) 3.2项目测试设计 (测试策略制定: 确定测试的方法和技术,如手动测试、自动化测试、性能测试工具的使用等。 测试用例设计: 设计测试用例时,应确保覆盖所有功能点、需求规则以及边界情况和异常情况。 使用有效的测试设计方法,如等价类划分、边界值分析、场景设计法、正交实验法等。 测试环境搭建: 搭建与项目运行环境相似的测试环境,包括硬件环境、软件环境、网络环境等。 确保测试环境的稳定性和可靠性,以便进行准确的测试。 测试数据准备: 根据测试用例的需求,准备相应的测试数据。 确保测试数据的真实性、有效性和代表性,以便进行准确的测试。 测试工具选择: 根据测试策略和测试用例的需求,选择合适的测试工具。 测试工具应具有易用性、稳定性和准确性等特点,以提高测试的效率和质量。 测试计划制定 制定详细的测试计划,包括测试时间、测试资源等。 确保测试计划的合理性和可行性,以便进行有序的测试。) 4.设计测试用例 5.实践反思与总结
06-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值