Safe-SettingActivity设置
来源:互联网 发布:安卓效率软件 编辑:程序博客网 时间:2024/06/07 22:53
设置的节目会涉及到很多功能,比如归属地的设置,显示的风格设置,黑名单设置,看门狗的设置等等设置,在AddressService中设置号码归属地显示的服务,LocationService提供了相关位置信息的服务手机防盗是通过广播进行实现的BootCompletedReceiver,首先设置一个安全号码进行保存,然后进行判断,比如当手机重新开机的时候会判断当前的号码是不是和安全号一致,同时向安全号码发送信息。
逻辑代码SettingActivity.java
package com.ldw.safe.Activity;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import com.ldw.safe.R;import com.ldw.safe.service.AddressService;import com.ldw.safe.service.CallSafeService;import com.ldw.safe.service.WatchDogService;import com.ldw.safe.utils.ServiceStatusUtils;import com.ldw.safe.view.SettingClickView;import com.ldw.safe.view.SettingItemView;/** * 设置中心 */public class SettingActivity extends Activity {private SettingItemView siv_update;//设置自动更新private SettingItemView siv_address;//归属地private SettingClickView scv_address_style;//归属地显示的风格private SettingClickView scv_address_location;//初始化归属地的位置private SettingItemView siv_callsafe;//黑名单private SettingItemView siv_watch_dog;//看门狗private SharedPreferences mPref;//把设置的数据保存在mPref@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setting); //把设置的数据保存在mPref mPref = getSharedPreferences("config", MODE_PRIVATE); initUpdateView();//初始化自动升级开关 initAdressView();//初始化归属地开关 initAddressStyle();//初始化归属地样式的选择 initAddressLocation();//初始化归属地出现的位置 initBlackView();//黑名单设置开关 initWatchDog();}/* * 看门狗设置初始化 */private void initWatchDog() {siv_watch_dog = (SettingItemView) findViewById(R.id.siv_watch_dog); // 根据归属地服务是否运行来更新checkbox boolean serviceRunning = ServiceStatusUtils.isServiceRunning(this, "com.ldw.safe.service.WatchDogService"); if (serviceRunning) { siv_watch_dog.setChecked(true); } else { siv_watch_dog.setChecked(false); } siv_watch_dog.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (siv_watch_dog.isChecked()) { siv_watch_dog.setChecked(false); stopService(new Intent(SettingActivity.this, WatchDogService.class));// 停止归属地服务 } else { siv_watch_dog.setChecked(true); startService(new Intent(SettingActivity.this, WatchDogService.class));// 开启归属地服务 } } });}/* * 黑名单设置初始化 */private void initBlackView() {siv_callsafe = (SettingItemView) findViewById(R.id.siv_callsafe); // 根据归属地服务是否运行来更新checkbox boolean serviceRunning = ServiceStatusUtils.isServiceRunning(this, "com.ldw.safe.service.CallSafeService"); if (serviceRunning) { siv_callsafe.setChecked(true); } else { siv_callsafe.setChecked(false); } siv_callsafe.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (siv_callsafe.isChecked()) { siv_callsafe.setChecked(false); stopService(new Intent(SettingActivity.this, CallSafeService.class));// 停止归属地服务 } else { siv_callsafe.setChecked(true); startService(new Intent(SettingActivity.this, CallSafeService.class));// 开启归属地服务 } } });}/* * 初始化自动升级开关 */private void initUpdateView(){siv_update = (SettingItemView)findViewById(R.id.siv_update); //siv_update.setTitle("自动更新设置"); //获取保存的数据,判断之前选择的是开始还是关闭,初始化进入界面是否勾选 boolean autoUpdate = mPref.getBoolean("auto_update", true); if(autoUpdate){ siv_update.setDesc("自动更新已经开启"); siv_update.setChecked(true); }else{ siv_update.setDesc("自动更新已经关闭"); siv_update.setChecked(false); } siv_update.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {//判断右边框的勾选状态if(siv_update.isChecked()){//设置不勾选siv_update.setChecked(false);//siv_update.setDesc("自动更新已经关闭");//编辑mPref的值mPref.edit().putBoolean("auto_update", false).commit();}else{//设置勾选siv_update.setChecked(true);//siv_update.setDesc("自动更新已经开启");//编辑mPref的值mPref.edit().putBoolean("auto_update", true).commit();}} });}/* * 初始化归属地开关 */private void initAdressView(){siv_address = (SettingItemView) findViewById(R.id.siv_address);//判断归属地的服务是否在运行boolean serviceRunning = ServiceStatusUtils.isServiceRunning(this, "com.ldw.safe.service.AddressService");//让服务的那个勾选框根据系统中是否有服务来判断是否去开启if(serviceRunning){siv_address.setChecked(true);}else{siv_address.setChecked(false);}siv_address.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {if(siv_address.isChecked()){siv_address.setChecked(false);stopService(new Intent(SettingActivity.this, AddressService.class));}else{siv_address.setChecked(true);//号码归属地显示开启的时候要开启服务startService(new Intent(SettingActivity.this, AddressService.class));}}});}/* * 修改号码归属地提示框的风格 */private void initAddressStyle(){scv_address_style = (SettingClickView) findViewById(R.id.scv_address_style);scv_address_style.setTitle("归属地提示框风格");//获取保存的样式int style = mPref.getInt("address_Style", 0);//设置样式scv_address_style.setDesc(items[style]);scv_address_style.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubshowSingleChooseDialog();}});}final String[] items = new String[]{"半透明", "活力橙", "卫士蓝", "金属灰", "苹果绿"};/* * 弹出归属地样式选择的单选框 */public void showSingleChooseDialog(){AlertDialog.Builder builder = new AlertDialog.Builder(this);//设置选择框额logobuilder.setIcon(R.drawable.ic_launcher);builder.setTitle("归属地提示框风格");//获取保存的风格样式,默认为0int style = mPref.getInt("address_Style", 0);builder.setSingleChoiceItems(items, style, new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {//保存选择的样式的序号mPref.edit().putInt("address_Style", which).commit();//点击以后对话框消失dialog.dismiss();//设置组合控件的文字描述scv_address_style.setDesc(items[which]);}});builder.setNegativeButton("取消", null);builder.show();}/* * 初始化归属地出现的位置 */private void initAddressLocation(){scv_address_location = (SettingClickView) findViewById(R.id.scv_address_location);scv_address_location.setTitle("归属地提示框的显示位置");scv_address_location.setDesc("设置归属地提示框的显示位置");scv_address_location.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {//点击以后直接跳转页面startActivity(new Intent(SettingActivity.this, DragViewActivity.class));}});}}AddressService.java号码归属地的显示,显示的时候是通过自定义的Toast,并且可以改变其位置
package com.ldw.safe.service;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.graphics.PixelFormat;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.view.WindowManager;import android.widget.TextView;import com.ldw.safe.R;import com.ldw.safe.db.dao.AddressDao;/* * 来电提醒的服务 */public class AddressService extends Service {private TelephonyManager tm;private MyListener listener;private OutCallReceiver receiver;private WindowManager mWM;private int startX;private int startY;//private TextView view;private View view;private SharedPreferences mPref;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate(){super.onCreate();//读取样式的配置参数mPref = getSharedPreferences("config", MODE_PRIVATE);tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);listener = new MyListener();tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//监听打电话的状态receiver = new OutCallReceiver();IntentFilter filter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);registerReceiver(receiver, filter);//动态注册广播}class MyListener extends PhoneStateListener{//监听电话状态的变化@Overridepublic void onCallStateChanged(int state, String incomingNumber){//switch(state){//电话铃声响起case TelephonyManager.CALL_STATE_RINGING:System.out.println("CALL_STATE_RINGING");//获取来电的号码归属地String address = AddressDao.getAddress(incomingNumber);//Toast的形式弹出号码归属地//Toast.makeText(AddressService.this, address, Toast.LENGTH_LONG).show();//自定义的Toast显示号码归属地showToast(address);break;//监听电话闲置的事件case TelephonyManager.CALL_STATE_IDLE://关闭自定义的Toast显示if(mWM != null && view != null){//挂断电话的时候,移除窗体mWM.removeView(view);}break;default:break;}super.onCallStateChanged(state, incomingNumber);}}/* * 监听去电 的广播接收者,添加权限PROCESS_OUTGOING_CALLS */class OutCallReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {//获取到来电的号码String number = getResultData();//获取到号码的归属地String address = AddressDao.getAddress(number);//Toast的形式弹出号码归属地//Toast.makeText(context, address, Toast.LENGTH_LONG).show();//自定义的Toast显示号码归属地showToast(address);}} @Override public void onDestroy(){ super.onDestroy(); //关闭服务,停止来电监听 tm.listen(listener, PhoneStateListener.LISTEN_NONE); //注销广播 unregisterReceiver(receiver); } /* * 自定义归属地显示浮窗,取代Toast,需要权限SYSTEM_ALERT_WINDOW */ private void showToast(String text){ mWM = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); //获取屏幕的宽度和高度 final int winWidth = mWM.getDefaultDisplay().getWidth(); final int winHeight = mWM.getDefaultDisplay().getHeight(); final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); final WindowManager.LayoutParams params = mParams; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; params.format = PixelFormat.TRANSLUCENT; params.type = WindowManager.LayoutParams.TYPE_PHONE; //将重心位置设置成左上方(0,0),默认实在重心位置 params.gravity = Gravity.LEFT + Gravity.TOP; params.setTitle("Toast"); //获取到之前归属地显示的坐标 int lastX = mPref.getInt("lastX", 0); int lastY = mPref.getInt("lastY", 0); //params.x和 params.y是设置基于左上方的偏移量 params.x = lastX; params.y = lastY; //原始的view显示 //view = new TextView(this); //自定义的view显示 view = View.inflate(this, R.layout.toast_address, null); //初始化样式 int[] bgs = new int[] { R.drawable.call_locate_white,R.drawable.call_locate_orange, R.drawable.call_locate_blue,R.drawable.call_locate_gray, R.drawable.call_locate_green }; //获取保存的样式数据int style = mPref.getInt("address_Style", 0);//设置样式view.setBackgroundResource(bgs[style]); TextView tvAddress= (TextView) view.findViewById(R.id.tv_address); tvAddress.setText(text); //tvAddress.setTextColor(Color.BLUE); //将view添加到窗体 mWM.addView(view, params); //view响应点击事件 view.setOnTouchListener(new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) {System.out.println("onTouch...");switch(event.getAction()){case MotionEvent.ACTION_DOWN://获取起始点在屏幕中的坐标startX = (int) event.getRawX(); startY = (int) event.getRawY(); break;case MotionEvent.ACTION_MOVE://获取结束点的坐标int endX = (int) event.getRawX();int endY = (int) event.getRawY();//计算偏移量int dx = endX - startX;int dy = endY - startY;//更新选民付出的位置params.x += dx;params.y += dy;//窗口x,y的最小最大的范围的限制,防止坐标越界if(params.x < 0){params.x = 0;}if(params.y < 0){params.y = 0;}if(params.x > winWidth - view.getWidth()){params.x = winWidth - view.getWidth();}if(params.y > winHeight - view.getHeight()){params.y = winHeight - view.getHeight();}//窗口更新位置mWM.updateViewLayout(view, params);System.out.println("params.x" + params.x + "params.y" +params.y);// 重新初始化起点坐标startX = (int) event.getRawX();startY = (int) event.getRawY();break;case MotionEvent.ACTION_UP:// 编辑保存记录坐标点Editor edit = mPref.edit();edit.putInt("lastX", params.x);edit.putInt("lastY", params.y);edit.commit();break;}return true;} }); }}LocationService.java这个Service提供了位置的相关信息,手机的位置信息,并把位置保存在SharePreference中
package com.ldw.safe.service;import android.app.Service;import android.content.Intent;import android.content.SharedPreferences;import android.location.Criteria;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.os.IBinder;import android.widget.TextView;/* * 获取经纬度坐标 */public class LocationService extends Service {private TextView tvLocation;private LocationManager lm;private MyLocationListener listener;public SharedPreferences mPref;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate(){super.onCreate();mPref = getSharedPreferences("config", MODE_PRIVATE);lm = (LocationManager) getSystemService(LOCATION_SERVICE); //获取所有的位置提供者(定位方法) //List<String> allProviders = lm.getAllProviders(); //System.out.println(allProviders);//创建CriteriaCriteria criteria = new Criteria();//是否允许付费criteria.setCostAllowed(true);criteria.setAccuracy(criteria.ACCURACY_FINE);//获取最佳的定位方法 String bestProvider = lm.getBestProvider(criteria, true); listener = new MyLocationListener(); //第一个参数是提供位置的方式,第二个参数是最短的更新位置的时间,第三个参数是最短的更新位置的距离 //0表示随时更新 lm.requestLocationUpdates(bestProvider, 0, 0, listener);}class MyLocationListener implements LocationListener{ //位置发生回掉的函数@Overridepublic void onLocationChanged(Location location) {String latitude = "经度" + location.getLatitude();String longitude = "维度" + location.getLongitude();//保存获取的经纬度mPref.edit().putString("location", "latitude:" + latitude + "longitude:" +longitude).commit();//获取到经纬度就关闭掉服务,节约用电stopSelf();}//位置提供者状态发生变化的回掉@Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {// TODO Auto-generated method stub}//用户把位置提供者打开的时候的回掉@Overridepublic void onProviderEnabled(String provider) {// TODO Auto-generated method stub}@Overridepublic void onProviderDisabled(String provider) {// TODO Auto-generated method stub} } @Override public void onDestroy(){ super.onDestroy(); //activity销毁时,关闭定位 lm.removeUpdates(listener); }}
BootCompletedReceiver.java
package com.ldw.safe.receiver;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.telephony.SmsManager;import android.telephony.TelephonyManager;import android.text.TextUtils;/* * 监听手机开机启动的广播 */public class BootCompletedReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {SharedPreferences mPref = context.getSharedPreferences("config", Context.MODE_PRIVATE);//防盗保护开启的时候才做下面的处理boolean protect = mPref.getBoolean("protect", false);if(protect){String sim = mPref.getString("sim", null);//获取绑定的sim卡的信息if(!TextUtils.isEmpty(sim)){ //获取当前的sim卡TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);String currentSim = tm.getSimSerialNumber();//比较序列号是否一致if(sim.equals(currentSim)){System.out.println("手机安全");}else{System.out.println("sim卡变更了");//获取到保存的安全号码String phone = mPref.getString("safe_phone", null);SmsManager smsManager = SmsManager.getDefault();//向安全号码发送信息smsManager.sendTextMessage(phone, null, "sim card hs changerd", null, null);} }}}}
阅读全文
0 0
- Safe-SettingActivity设置
- SettingActivity
- 59、微信-我-设置SettingActivity
- SettingActivity学习笔记
- safe
- safe
- 快速实现 SettingActivity,多种布局轻松搞定
- Thread-safe, Signal-safe
- thread safe
- Safe Browsing
- Active Safe
- Safe Salutations
- safe nic
- safe update
- 柜 safe
- 时区设置问题导致的php错误 date(): It is not safe to rely on the system's timezone settings.
- tcl/tk safe - 2 - Safe Base
- reentrant,thread-safe 和 async-signal-safe
- Effective C++笔记(1)
- 比较全的参数绑定方式
- uno
- Effective C++笔记(2)
- MySQL 事务
- Safe-SettingActivity设置
- python写算法题:leetcode: 36. Valid Sudoku
- Thinkphp关联模型BELONGS_TO
- idea 引入依赖版本错误
- Redis 数据类型及应用场景
- BIND高级应用
- LC 627. Swap Salary
- snmp配置
- 教你如何直接在github上预览html网页效果