我的手机管家(21) 设置中心

我的手机管家(21) 设置中心 :

包括三个界面:四个功能

   (1)电话归属地查询

        使用SQLIteDatabase 查询address.db, 查询指定号码的归属地

   (2) 检查应用版本更新

   (3)关于我的手机管家信息

   (4)黑名单服务的开启与关闭

黑名单服务:

  通过绑定广播进行短信的拦截, 会比静态注册先拦截短信

  通过电话管理器TelephonyManager监听电话状态

一旦有电话打入, 首先进行黑名单对比。

package com.chb.myphonesave.service;

import java.lang.reflect.Method;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;

import com.android.internal.telephony.ITelephony;
import com.chb.myphonesave.dao.BlackNumberDao;
/**
 *
 */
public class BlackNumberService extends Service {

    private InnerSmsReceiver mReceiver;
    private TelephonyManager mTM;
    private MyPhoneStateListener mListener;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        Context ctx = getApplicationContext();
        mTM = (TelephonyManager) ctx.getSystemService(TELEPHONY_SERVICE);
        mListener = new MyPhoneStateListener();
        mTM.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);
        // 注册短信广播监听
        mReceiver = new InnerSmsReceiver();
        IntentFilter filter = new IntentFilter(
                "android.provider.Telephony.SMS_RECEIVED");
        filter.setPriority(Integer.MAX_VALUE);// 设置优先级
        registerReceiver(mReceiver, filter);
    }

    class MyPhoneStateListener extends PhoneStateListener {
        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                int exist = BlackNumberDao.getInstance(
                        BlackNumberService.this).find(incomingNumber);
                if (exist > 0) {
                    // 1, 3
                    int mode = BlackNumberDao.getInstance(
                            BlackNumberService.this).findMode(incomingNumber);
                    if (mode == 1 || mode == 3) {// 拦截电话
                        // endCall
                        endCall();
                    }
                }
                break;
            default:
                break;
            }
            super.onCallStateChanged(state, incomingNumber);
        }
    }

    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
        mReceiver = null;
        // 停止来电 监听
        mTM.listen(mListener, PhoneStateListener.LISTEN_NONE);
        mListener = null;
    }
    /**
     * 挂断电话 需要权限: <uses-permission
     * android:name="android.permission.CALL_PHONE"/>
     */
    public void endCall() {
        // android.os.ServiceManager
        // ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
        try {
            Class clazz = BlackNumberService.class.getClassLoader().loadClass(
                    "android.os.ServiceManager");// 获取ServiceManager的字节码
            Method method = clazz.getDeclaredMethod("getService", String.class);// 获取方法
            IBinder binder = (IBinder) method.invoke(null,
                    Context.TELEPHONY_SERVICE);// 通过反射调用方法,获取IBinder代理对象
            ITelephony telephony = ITelephony.Stub.asInterface(binder);
            telephony.endCall();// 挂断电话
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 动态注册的广播比静态注册的更先拦截到短信
    class InnerSmsReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {

            Object[] objs = (Object[]) intent.getExtras().get("pdus");

            for (Object object : objs) {// 140个字节, 70个汉字,
                                        // 当短信超过140个字节时,会分多条短信发送,所以会循环多次,
                                        // 一般情况下该for循环只走一次
                SmsMessage message = SmsMessage.createFromPdu((byte[]) object);
                String phoneNumber = message.getOriginatingAddress();// 获取短信来电号码
                int exist = BlackNumberDao.getInstance(
                        BlackNumberService.this).find(phoneNumber);

                if (exist > 0) {// 如果号码在黑名单范围之内
                    int mode = BlackNumberDao.getInstance(
                            BlackNumberService.this).findMode(phoneNumber);

                    if (mode > 1) {// 如果发现是拦截短信或者短信+电话
                        abortBroadcast();// 终止广播传递
                    }
                }
            }
        }

    }
}
时间: 2024-11-03 21:58:04

我的手机管家(21) 设置中心的相关文章

99手机管家项目的总结

断断续续,终于做完了这个项目(2014-11-24~2015-01-01),感慨万千,真的是白天求生存,晚上求发展. 在手机管家的项目中,实现了手机防盗,通讯卫士,软件管理,进程管理,流量统计,手机杀毒,缓存清理,高级工具,设置中心等功能.使用到的东西: 1.Android四大控件,各大布局. 2.关于ListView的convertView的复用(Listview的优化). 3.ListView的convertView复用带来的数据错乱的问题. 4.AIDL和反射的理解(挂断电话,清理缓存).

我的手机管家(1) 主界面

我的手机管家 主界面布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" a

我的手机管家(5)骚扰拦截 布局界面

我的手机管家(5)骚扰拦截   布局界面: 添加黑名单, 拦截信息,和电话 主界面: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_

我的手机管家(10)病毒扫描 拷贝病毒数据库

我的手机管家(10)病毒扫描    拷贝病毒数据库 (1)将病毒数据库复制到asserts文件夹下,然后复制到 "data/data/com.chb.myphonesafe/files/antivirus.db" //数据库路径必须是data/data目录下,否则无法访问 拷贝:AssetUtil package com.chb.myphonesave.util; import java.io.File; import java.io.FileOutputStream; import

通过线程通讯获取手机正在运行中的软件及大小(仿手机管家 扫描软件)

其实我原本是只想说一个线程之间的通讯 handler,但是觉得内容有点少,就直接写了个demo.我之前是做过仿手机管家这种软件的(当然只是自己做着好玩的),所以 就提取了一点内容结合线程通讯写了个小的demo. 不说废话了,直接上代码: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas

我的手机管家(11) 网络助手 界面设计及适配器

我的手机管家(11)   网络助手  界面设计 使用一个 <SlidingDrawer>标签用来布局一个抽屉样式 两个属性要注意: 一个是内容布局id,   手柄id android:content="@+id/content" android:handle="@+id/handle" android:orientation="vertical" 抽出的方向 <SlidingDrawer android:id="@+i

类似腾讯手机管家应用源码完整版

类似腾讯手机管家应用源码,也是自己写的android手机管家,内附源代码,应用实现了手机防功能,通信卫士功能,软件管家,进程管理,手机杀毒等功能,里面的图片部分用到了腾讯手机管家的图片,所以跟腾讯手机管家应用比较类似了,大家可以参考一下,可能有的功能还没有那么完善,不过大家可以再这个基础上进行升级,创新,增加自己的特色吧.或者大家可以看看安装演示版(附件下面) 源码项目下载:http://code.662p.com/view/8982.html <ignore_js_op> <ignor

类似腾讯手机管家应用android源码

类似腾讯手机管家应用源码,也是自己写的android手机管家,内附源代码,应用实现了手机防功能,通信卫士功能,软件管家,进程管理,手机杀毒等功能,里面的图片部分用到了腾讯手机管家的图片,所以跟腾讯手机管家应用比较类似了,大家可以参考一下,可能有的功能还没有那么完善,不过大家可以再这个基础上进行升级,创新,增加自己的特色吧.或者大家可以看看安装演示版(附件下面) <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore

仿腾讯手机管家火箭发射

好久没有写过博客了,前段时间一个项目中用到了浮点(漂浮在窗体上),于是突发灵感发现可以实现类似于腾讯手机管家火箭升空效果  实现步骤:1:新建一个类 名为RocketView(用来显示浮点,当手指拖动浮点变成火箭图标)                         2:新建一个类 名LaunchView(火箭发射台,当手指拖动RocketView浮点到指定位置释放手指后 火箭深空)                         3:在activity中调用RocketView的显示浮点方法进