手机安全卫士第三天

手机安全卫士第三天实现的功能:

1.向导页的手势滑动。

2.首次绑定sim卡,并在重启的时候效验sim卡序列号是否相同。

3.为发送进来的短信做一个广播监听,监听短信号码和内容。把号码和安全号码进行对比,内容和特殊指令进行对比。

4.手动控制播放报警音乐和获取地理位置。


首先向导页手势滑动功能的实现

向导页手势滑动用到了一个GentureDetector类,在使用GentureDetector只需要在new的时候传入监听手势滑动时间即可,但是new的GentureDetector类要放在空间的onTouch中惊醒调用,使用方法如下。

<span style="font-size:14px;">private GestureDetector mDetector;
 mDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
            @Override
            /**
             * 监听手势滑动事件 e1表示滑动的起点,e2表示滑动终点 velocityX表示水平速度 velocityY表示垂直速度
             */
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                // 判断纵向滑动幅度是否过大, 过大的话不允许切换界面
                if (Math.abs(e1.getRawY()-e2.getRawY())>100){
                    return true;
                }
                // 判断滑动是否过慢
                if (Math.abs(velocityX)<100){
                    return true;
                }
                // 向左划, 下一页
                if (e1.getRawX() - e2.getRawX() > 200) {
                    shownextPage();
                }
                // 向右划,上一页
                if (e2.getRawX() - e1.getRawX() > 200) {
                    showPreviousPage();
                }
                return super.onFling(e1, e2, velocityX, velocityY);
            }
        });
    }
    //点击按钮显示下一页
    public void next(View view) {
        shownextPage();
    }

    //点击按钮显示下一页
    public void previous(View view) {
        showPreviousPage();
    }

    public abstract void showPreviousPage();

    public abstract void shownextPage() ;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
}
</span>
由于4个向导页的滑动事件都是一样,就构造了一个4个页面的基类,并把跳转下一页,上一页变成抽象发现,供4个向导页实现。


然后进入到第二个向导页,要进行一次绑卡操作,否则不能进入下一页。第二个向导页用到了第二天创建的自定义控件settingItemView,并与该自定义控件进行了交互。用来判断按下去是否已经绑定了sim卡。

  <span style="font-size:14px;">private SettingItemView sivSim;
   sivSim = (SettingItemView) findViewById(R.id.siv_sim);
        String sim = mPref.getString("sim", null);
        if (!TextUtils.isEmpty(sim)){
            sivSim.setChecked(true);
        }else {
            sivSim.setChecked(false);
        }
        sivSim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (sivSim.isChecked()){
                    sivSim.setChecked(false);
                    mPref.edit().remove("sim").commit();// 删除已绑定的sim卡
                }else {
                    sivSim.setChecked(true);
                    TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
                    String simSerialNumber = tm.getSimSerialNumber();// 获取sim卡序列号
                    mPref.edit().putString("sim",simSerialNumber).commit();
                }
            }
        });</span>
在这里默认是没有绑定sim卡的,然后在这里加一个判断, 如果用户没有加入sim卡,则不允许用户进入第三个向导页。

 <span style="font-size:14px;">@Override
    public void shownextPage() {
        String sim = mPref.getString("sim", null);
        if (TextUtils.isEmpty(sim)) {
            Toast.makeText(this, "必须先绑定sim卡哦!", Toast.LENGTH_SHORT).show();
            return;
        }
        startActivity(new Intent(this,Setup3Activity.class));
        finish();
        // 两个界面切换的动画, 进入动画和退出动画
        overridePendingTransition(R.anim.tran_in,R.anim.tran_out);
    }</span>

然后增加一个开机广播,用来监听绑定的sim序列号和启动时的序列号是否相同,如果相同,不做任何操作,如果不同,发送一条短信给安全号码;

<pre style="background-color:#ffffff;color:#000000;font-family:'宋体';font-size:12.0pt;"><pre name="code" class="java">/<span style="font-size:14px;">**
 * 监听手机开机启动的广播
 * Created by Administrator on 2016/4/28.
 */
public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        SharedPreferences sp = context.getSharedPreferences("config", Context.MODE_PRIVATE);
        boolean protect = sp.getBoolean("protect", false);
        if (protect) {
            String sim = sp.getString("sim", null);//拿到保存过得sim卡信息
            if (!TextUtils.isEmpty(sim)) {
                TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                String currentSim = tm.getSimSerialNumber();//获取当前的sim卡信息
                if (sim.equals(currentSim)) {
                    //说明手机安全
                } else {
                    //sim卡已经更换
                    String safe_phone = sp.getString("safe_phone", "");
                    // 发送短信给安全号码
                    SmsManager smsManager = SmsManager.getDefault();
                    smsManager.sendTextMessage(safe_phone, null, "sim卡已经更换", null, null);
                }
            }
        }
    }
}
</span>

然后为发送进来的短信增加一个广播用来判断是否输入了特殊指令。
  <span style="font-size:14px;"> //拿到短信包
        Object[] objects = (Object[]) intent.getExtras().get("pdus");
        for (Object object:objects) {
            // 短信最多140字节,
            // 超出的话,会分为多条短信发送,所以是一个数组,因为我们的短信指令很短,所以for循环只执行一次
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) object);
            String originatingAddress = smsMessage.getOriginatingAddress();// 短信来源号码
            String messageBody = smsMessage.getMessageBody();// 短信内容</span>

最后把短信内容与设置的特殊指令进行判断,如果判断相等,则进行相应的处理。
 <span style="font-size:14px;"> if ("#*alarm*#".equals(messageBody)){
                // 播放报警音乐, 即使手机调为静音,也能播放音乐, 因为使用的是媒体声音的通道,和铃声无关
                MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.alarm);
                mediaPlayer.setVolume(1f, 1f);
                mediaPlayer.setLooping(true);
                mediaPlayer.start();
                abortBroadcast();//中断短信
            }else if("#*location*#".equals(messageBody)){
                //获取经纬度坐标,开启服务
                context.startActivity(new Intent(context, LocationService.class));
                mPref = context.getSharedPreferences("config", Context.MODE_PRIVATE);
                String location = mPref.getString("location", "getting location...");
                String safe_phone = mPref.getString("safe_phone", "");
                // 发送短信给安全号码
                SmsManager smsManager = SmsManager.getDefault();
                smsManager.sendTextMessage(safe_phone, null,location , null, null);
                abortBroadcast();// 中断短信的传递, 从而系统短信app就收不到内容了
            }else if ("#*wipedata*#".equals(messageBody)) {
                abortBroadcast();
            } else if ("#*lockscreen*#".equals(messageBody)) {
                abortBroadcast();
            }</span>
要获取地理位置有三种办法:网络定位,基站定位,和GPS定位优缺点分别如下。




在真实的机器上应该是使用最好的一个定位技术,使用
getBestProvider(criteria, true);// 获取最佳位置提供者

获取地理位置这里创建一个服务然后把经纬度写在SharedPreferences中
<span style="font-size:14px;">/**
 * 获取经纬度坐标的service
 * Created by Administrator on 2016/4/30.
 */
public class LocationService extends Service {

    private SharedPreferences mPref;
    private LocationManager lm;
    private MyLocationListener listener;

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void onCreate() {
        super.onCreate();
        mPref = getSharedPreferences("config", MODE_PRIVATE);
        lm = (LocationManager) getSystemService(LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        criteria.setCostAllowed(true);// 是否允许付费,比如使用网络定位
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        String bestProvider = lm.getBestProvider(criteria, true);// 获取最佳位置提供者
        listener = new MyLocationListener();
        lm.requestLocationUpdates(bestProvider, 0, 0, listener);
    }

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

    class MyLocationListener implements LocationListener {
        //位置发生改变调用该方法
        @Override
        public void onLocationChanged(Location location) {
            // 将获取的经纬度保存在sp中
            mPref.edit()
                    .putString(
                            "location",
                            "j:" + location.getLongitude() + "; w:"
                                    + location.getLatitude()).commit();
            stopSelf();//停掉service
        }
        //位置提供者状态发生变化
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
        //开启手机定义服务
        @Override
        public void onProviderEnabled(String provider) {

        }
        //关闭手机定位服务
        @Override
        public void onProviderDisabled(String provider) {

        }
    }
    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void onDestroy() {
        super.onDestroy();
        lm.removeUpdates(listener);// 当activity销毁时,停止更新位置, 节省电量
    }
}</span>





 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值