手机安全卫士第三天
2016-04-30 01:52
253 查看
手机安全卫士第三天实现的功能: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序列号和启动时的序列号是否相同,如果相同,不做任何操作,如果不同,发送一条短信给安全号码;
然后为发送进来的短信增加一个广播用来判断是否输入了特殊指令。
获取地理位置这里创建一个服务然后把经纬度写在SharedPreferences中
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>
相关文章推荐
- Mac下ProxyChains Tor实现shell代理,隐藏自己的ssh登陆ip
- keras系列-安装和大体结构
- 22. Generate Parentheses
- 杭电-5137-How Many Maos Does the Guanxi Worth
- 安卓APP测试之使用Burp Suite实现HTTPS抓包方法
- java发送http的get,post请求【学习记录】(转)
- 机器学习向量化练习
- 使用Unity3D 5.3.4 模仿2D游戏 FlappyBird(三)
- java实现定时任务
- 【LeetCode】Same Tree 解题报告
- 大数据学习笔记·社会计算(2)
- Android应用资源
- 实习总结04
- 渗透测试Kali Linux与Parrot Security os安装体验
- Linux下如何检测内存泄漏
- 将字符串编码成数值,求数值最大和问题(今日头条笔试题)
- 提升个人思想深度的11本书,每一本都令人反思良久
- mybatis like 模糊查询问题
- Java读写XML文件(DOM4J包)
- linux如何安装java环境