您的位置:首页 > 其它

手机安全卫士第三天

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序列号和启动时的序列号是否相同,如果相同,不做任何操作,如果不同,发送一条短信给安全号码;
<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>



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: