手机卫士15-归属地界面和手机定位功能

简介: 首先,先把我之前写的那个更新操作的一个bug修复先,这个bug就是在Android4以上,我们已经不能在主线程里面进行网络操作的啦,如果进行网络操作,就会报错 所以我们就要做一下改动,我们在onCreate方法里面开启一个线程,用来检测更新信息的 <font color="#333333"><font face="Arial"> 

首先,先把我之前写的那个更新操作的一个bug修复先,这个bug就是在Android4以上,我们已经不能在主线程里面进行网络操作的啦,如果进行网络操作,就会报错

所以我们就要做一下改动,我们在onCreate方法里面开启一个线程,用来检测更新信息的

  1. <font color="#333333"><font face="Arial">                new Thread()
  2.                 {
  3.                         public void run() 
  4.                         {
  5.                                 try
  6.                                 {
  7.                                         UpdateInfoService updateInfoService = new UpdateInfoService(SplashActivity.this);
  8.                                         info = updateInfoService.getUpdateInfo(R.string.serverUrl);
  9.                                 }
  10.                                 catch (Exception e)
  11.                                 {
  12.                                         e.printStackTrace();
  13.                                 }
  14.                         };
  15.                 }.start();</font></font>
复制代码
然后呢,就在原来的isNeedUpdate方法里面进行一些修改啦

  1. <font color="#333333"><font face="Arial">        private boolean isNeedUpdate(String version)
  2.         {
  3.                 if(info == null)
  4.                 {
  5.                         Toast.makeText(this, "获取更新信息异常,请稍后再试", Toast.LENGTH_SHORT).show();
  6.                         loadMainUI();
  7.                         return false;
  8.                 }
  9.                 String v = info.getVersion();
  10.                 if(v.equals(version))
  11.                 {
  12.                         Log.i(TAG, "当前版本:" + version);
  13.                         Log.i(TAG, "最新版本:" + v);
  14.                         loadMainUI();
  15.                         return false;
  16.                 }
  17.                 else
  18.                 {
  19.                         Log.i(TAG, "需要更新");
  20.                         return true;
  21.                 }
  22.         }</font></font>
复制代码
好啦,到这里,我们的这个bug就修复的啦。在进入今天的内容之前,先谢谢一位网友啦,是他发现这个问题的,非常感谢!好,我们今天要讲的就是设置手机归属地的样式以及显示位置,先上图,让大家看一下我们今天要做的效果           大家可以看到,我们今天要做的就是显示风格和位置,那个显示风格就是上面的第二张图片,其实这个功能很简单的,就是记录下来用户设置的风格,然后就进行一个背景的设置而已,而第二个要做的就是显示的位置啦,上面第三张图就是啦,我们把那个activity做成了透明的了,如果你觉得不好,那么也可以不做成透明的,我们可以手动那个紫色的方块,来确定要显示的位置!设置好这些之后,再把服务开启,我们就可以看到下面的效果的啦! 好,废话不多说,我们现在就开始做,我们首先把风格那个对话框给做出来com.xiaobin.security.ui.AToolActivity
  1. package com.xiaobin.security.ui;

  2. import java.io.File;

  3. import android.annotation.SuppressLint;
  4. import android.app.Activity;
  5. import android.app.AlertDialog;
  6. import android.app.ProgressDialog;
  7. import android.content.Context;
  8. import android.content.DialogInterface;
  9. import android.content.Intent;
  10. import android.content.SharedPreferences;
  11. import android.content.SharedPreferences.Editor;
  12. import android.graphics.Color;
  13. import android.os.Bundle;
  14. import android.os.Environment;
  15. import android.os.Handler;
  16. import android.os.Message;
  17. import android.view.View;
  18. import android.view.View.OnClickListener;
  19. import android.widget.CheckBox;
  20. import android.widget.CompoundButton;
  21. import android.widget.CompoundButton.OnCheckedChangeListener;
  22. import android.widget.TextView;
  23. import android.widget.Toast;

  24. import com.xiaobin.security.R;
  25. import com.xiaobin.security.engine.DownloadTask;
  26. import com.xiaobin.security.service.AddressService;

  27. public class AToolActivity extends Activity implements OnClickListener
  28. {
  29.         private static final int ERROR = 0;
  30.         private static final int SUCCESS = 1;
  31.         
  32.         private TextView tv_atool_query;
  33.         private TextView tv_atool_number_service_state;
  34.         private CheckBox cb_atool_state;
  35.         private TextView tv_atool_select_bg;
  36.         private TextView tv_atool_change_location;
  37.         private Intent serviceIntent;
  38.         private ProgressDialog pd;
  39.         
  40.         private SharedPreferences sp;
  41.         
  42.         @SuppressLint("HandlerLeak")
  43.         private Handler handler = new Handler()
  44.         {
  45.                 public void handleMessage(Message msg) 
  46.                 {
  47.                         switch(msg.what)
  48.                         {
  49.                                 case ERROR : 
  50.                                         Toast.makeText(AToolActivity.this, "下载数据库失败,请检查网络!", Toast.LENGTH_SHORT).show();
  51.                                         break;
  52.                                         
  53.                                 case SUCCESS : 
  54.                                         Toast.makeText(AToolActivity.this, "数据库下载成功!", Toast.LENGTH_SHORT).show();
  55.                                         break;
  56.                                         
  57.                                 default : 
  58.                                         break;
  59.                         }
  60.                 }
  61.         };
  62.         
  63.         @Override
  64.         protected void onCreate(Bundle savedInstanceState)
  65.         {
  66.                 super.onCreate(savedInstanceState);
  67.                 setContentView(R.layout.atool);
  68.                 
  69.                 sp = getSharedPreferences("config", Context.MODE_PRIVATE);
  70.                 
  71.                 tv_atool_query = (TextView) findViewById(R.id.tv_atool_query);
  72.                 tv_atool_query.setOnClickListener(this);
  73.                 
  74.                 tv_atool_select_bg = (TextView) findViewById(R.id.tv_atool_select_bg);
  75.                 tv_atool_select_bg.setOnClickListener(this);
  76.                 
  77.                 tv_atool_change_location = (TextView) findViewById(R.id.tv_atool_change_location);
  78.                 tv_atool_change_location.setOnClickListener(this);
  79.                 
  80.                 tv_atool_number_service_state = (TextView) findViewById(R.id.tv_atool_number_service_state);
  81.                 cb_atool_state = (CheckBox) findViewById(R.id.cb_atool_state);
  82.                 serviceIntent = new Intent(this, AddressService.class);
  83.                 cb_atool_state.setOnCheckedChangeListener(new OnCheckedChangeListener()
  84.                 {
  85.                         @Override
  86.                         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
  87.                         {
  88.                                 if(isChecked)
  89.                                 {
  90.                                         startService(serviceIntent);
  91.                                         tv_atool_number_service_state.setTextColor(Color.BLACK);
  92.                                         tv_atool_number_service_state.setText("归属地服务已开启");
  93.                                 }
  94.                                 else
  95.                                 {
  96.                                         stopService(serviceIntent);
  97.                                         tv_atool_number_service_state.setTextColor(Color.RED);
  98.                                         tv_atool_number_service_state.setText(R.string.number_service_state);
  99.                                 }
  100.                         }
  101.                 });
  102.         }

  103.         @Override
  104.         public void onClick(View v)
  105.         {
  106.                 switch(v.getId())
  107.                 {
  108.                         case R.id.tv_atool_query : 
  109.                                 query();
  110.                                 break;
  111.                                 
  112.                         case R.id.tv_atool_select_bg : 
  113.                                 selectStyle();
  114.                                 break;
  115.                                 
  116.                         case R.id.tv_atool_change_location : 
  117.                                 Intent intent = new Intent(this, DragViewActivity.class);
  118.                                 startActivity(intent);
  119.                                 break;
  120.                                 
  121.                         default : 
  122.                                 break;
  123.                 }
  124.         }
  125.         
  126.         private void query()
  127.         {
  128.                 if(isDBExist())
  129.                 {
  130.                         Intent intent = new Intent(this, QueryNumberActivity.class);
  131.                         startActivity(intent);
  132.                 }
  133.                 else
  134.                 {
  135.                         //提示用户下载数据库
  136.                         pd = new ProgressDialog(this);
  137.                         pd.setMessage("正在下载数据库...");
  138.                         pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  139.                         pd.setCancelable(false);
  140.                         pd.show();
  141.                         new Thread()
  142.                         {
  143.                                 public void run() 
  144.                                 {
  145.                                         String path = getResources().getString(R.string.serverdb);
  146.                                         File dir = new File(Environment.getExternalStorageDirectory(), "/security/db");
  147.                                         if(!dir.exists())
  148.                                         {
  149.                                                 dir.mkdirs();
  150.                                         }
  151.                                         String dbPath = Environment.getExternalStorageDirectory() + "/security/db/data.db";
  152.                                         try
  153.                                         {
  154.                                                 //这个类,我们在做更新apk的时候已经写好的啦,现在直接拿过来用就可以啦
  155.                                                 DownloadTask.getFile(path, dbPath, pd);
  156.                                                 pd.dismiss();
  157.                                         }
  158.                                         catch (Exception e)
  159.                                         {
  160.                                                 e.printStackTrace();
  161.                                                 pd.dismiss();
  162.                                                 Message message = new Message();
  163.                                                 message.what = ERROR;
  164.                                                 handler.sendMessage(message);
  165.                                         }
  166.                                 };
  167.                         }.start();
  168.                 }
  169.         }
  170.         
  171.         private boolean isDBExist()
  172.         {
  173.                 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
  174.                 {
  175.                         File file = new File(Environment.getExternalStorageDirectory() + "/security/db/data.db");
  176.                         if(file.exists())
  177.                         {
  178.                                 return true;
  179.                         }
  180.                 }
  181.                 return false;
  182.         }
  183.         
  184.         //显示风格的对话框,我准备了5张不同风格的背景图片,根据用户选择的风格不一样,设置不同的背景
  185.         private void selectStyle()
  186.         {
  187.                 AlertDialog.Builder builder = new AlertDialog.Builder(this);
  188.                 builder.setTitle("归属地显示风格");
  189.                 String[] items = new String[] {"半透明", "活力橙", "苹果绿", "孔雀蓝", "金属灰"};
  190.                 builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener()
  191.                 {
  192.                         @Override
  193.                         public void onClick(DialogInterface dialog, int which)
  194.                         {
  195.                                 Editor editor = sp.edit();
  196.                                 editor.putInt("background", which);
  197.                                 editor.commit();
  198.                         }
  199.                 });
  200.                 builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
  201.                 {
  202.                         @Override
  203.                         public void onClick(DialogInterface dialog, int which)
  204.                         {
  205.                                 
  206.                         }
  207.                 });
  208.                 builder.create().show();
  209.         }

  210. }
复制代码
我们写了一个方法,selectStyle这个方法会把用户的设置记录下来,然后我们就在显示那个归属地那里读取出来,设置一下背景就可以啦,但我们现在先把那个显示位置的也做出来先其实这个也很简单的,我们就用一个onTouch事件,然后记录下最终的位置就可以的啦com.xiaobin.security.ui.DragViewActivity
  1. package com.xiaobin.security.ui;

  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.SharedPreferences;
  5. import android.content.SharedPreferences.Editor;
  6. import android.os.Bundle;
  7. import android.view.MotionEvent;
  8. import android.view.View;
  9. import android.view.View.OnTouchListener;
  10. import android.view.Window;
  11. import android.widget.ImageView;
  12. import android.widget.RelativeLayout;
  13. import android.widget.RelativeLayout.LayoutParams;

  14. import com.xiaobin.security.R;

  15. public class DragViewActivity extends Activity implements OnTouchListener
  16. {
  17.         private ImageView iv_drag_location;
  18.         private SharedPreferences sp;
  19.         
  20.         //记录第一次触摸的坐标
  21.         private int startX;
  22.         private int startY;
  23.         
  24.         @Override
  25.         protected void onCreate(Bundle savedInstanceState)
  26.         {
  27.                 super.onCreate(savedInstanceState);
  28.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
  29.                 setContentView(R.layout.drag_view);
  30.                 
  31.                 sp = getSharedPreferences("config", Context.MODE_PRIVATE);
  32.                 
  33.                 iv_drag_location = (ImageView) findViewById(R.id.iv_drag_location);
  34.                 iv_drag_location.setOnTouchListener(this);
  35.         }
  36.         
  37.         @Override
  38.         protected void onResume()
  39.         {
  40.                 super.onResume();
  41.                 
  42.                 //加载上次移动的效果
  43.                 int x = sp.getInt("lastX", 0);
  44.                 int y = sp.getInt("lastY", 0);
  45.                 /*iv_drag_location.layout(iv_drag_location.getLeft() + x, iv_drag_location.getTop() + y, 
  46.                                 iv_drag_location.getRight() + x, iv_drag_location.getBottom() + y);
  47.                 iv_drag_location.invalidate();*/
  48.                 RelativeLayout.LayoutParams params = (LayoutParams) iv_drag_location.getLayoutParams();
  49.                 params.leftMargin = x;
  50.                 params.topMargin = y;
  51.                 iv_drag_location.setLayoutParams(params);
  52.         }

  53.         @Override
  54.         public boolean onTouch(View v, MotionEvent event)
  55.         {
  56.                 switch(v.getId())
  57.                 {
  58.                         case R.id.iv_drag_location : 
  59.                                 switch(event.getAction())
  60.                                 {
  61.                                         case MotionEvent.ACTION_DOWN : 
  62.                                                 startX = (int) event.getRawX();
  63.                                                 startY = (int) event.getRawY();
  64.                                                 break;
  65.                                                 
  66.                                         case MotionEvent.ACTION_MOVE : 
  67.                                                 int x = (int) event.getRawX();
  68.                                                 int y = (int) event.getRawY();
  69.                                                 
  70.                                                 //算出移动距离
  71.                                                 int dx = x - startX;
  72.                                                 int dy = y - startY;
  73.                                                 int l = iv_drag_location.getLeft();
  74.                                                 int r = iv_drag_location.getRight();
  75.                                                 int t = iv_drag_location.getTop();
  76.                                                 int b = iv_drag_location.getBottom();
  77.                                                 
  78.                                                 //设置新的布局位置
  79.                                                 iv_drag_location.layout(l + dx, t + dy, r + dx, b + dy);
  80.                                                 
  81.                                                 //重新获取位置
  82.                                                 startX = (int) event.getRawX();
  83.                                                 startY = (int) event.getRawY();
  84.                                                 break;
  85.                                                 
  86.                                         case MotionEvent.ACTION_UP : 
  87.                                                 int lastX = iv_drag_location.getLeft();
  88.                                                 int lastY = iv_drag_location.getTop();
  89.                                                 Editor editor = sp.edit();
  90.                                                 editor.putInt("lastX", lastX);
  91.                                                 editor.putInt("lastY", lastY);
  92.                                                 editor.commit();
  93.                                                 break;
  94.                                                 
  95.                                         default : 
  96.                                                 break;
  97.                                 }
  98.                                 break;
  99.                                 
  100.                         default : 
  101.                                 break;
  102.                 }
  103.                 return true;
  104.         }

  105. }
复制代码
好啦,写完这两个,我们就可以回到我们之前显示归属地的那个Service里面写逻辑啦com.xiaobin.security.service.AddressService
  1. package com.xiaobin.security.service;

  2. import android.app.Service;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.SharedPreferences;
  6. import android.graphics.PixelFormat;
  7. import android.os.IBinder;
  8. import android.telephony.PhoneStateListener;
  9. import android.telephony.TelephonyManager;
  10. import android.view.Gravity;
  11. import android.view.View;
  12. import android.view.WindowManager;
  13. import android.widget.LinearLayout;
  14. import android.widget.TextView;

  15. import com.xiaobin.security.R;
  16. import com.xiaobin.security.engine.NumberAddressService;

  17. public class AddressService extends Service
  18. {
  19.         private TelephonyManager telephonyManager;
  20.         private MyPhoneListener listener;
  21.         private WindowManager windowManager;
  22.         private View view;
  23.         
  24.         private SharedPreferences sp;

  25.         @Override
  26.         public IBinder onBind(Intent intent)
  27.         {
  28.                 return null;
  29.         }
  30.         
  31.         @Override
  32.         public void onCreate()
  33.         {
  34.                 super.onCreate();
  35.                 
  36.                 sp = getSharedPreferences("config", Context.MODE_PRIVATE);
  37.                 
  38.                 windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
  39.                 listener = new MyPhoneListener();
  40.                 telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
  41.                 telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
  42.         }
  43.         
  44.         @Override
  45.         public void onDestroy()
  46.         {
  47.                 super.onDestroy();
  48.                 //停止监听
  49.                 telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE);
  50.         }
  51.         
  52.         //显示归属地的窗体
  53.         private void showLocation(String address)
  54.         {
  55.                 WindowManager.LayoutParams params = new WindowManager.LayoutParams();
  56.                 params.width = WindowManager.LayoutParams.WRAP_CONTENT;
  57.                 params.height = WindowManager.LayoutParams.WRAP_CONTENT;
  58.                 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE //无法获取焦点
  59.                                 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE //无法点击
  60.                                 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;//保持屏幕亮
  61.                 params.format = PixelFormat.TRANSLUCENT;//设置成半透明的
  62.                 params.type = WindowManager.LayoutParams.TYPE_TOAST;
  63.                 params.setTitle("Toast");
  64.                 
  65.                 //主要是确定坐标系是从左上角开始的,不然呆会设置位置的时候有些麻烦
  66.                 params.gravity = Gravity.LEFT | Gravity.TOP;
  67.                 params.x = sp.getInt("lastX", 0);
  68.                 params.y = sp.getInt("lastY", 0);
  69.                 
  70.                 view = View.inflate(getApplicationContext(), R.layout.show_location, null);
  71.                 LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll_location);
  72.                 int type = sp.getInt("background", 0);
  73.                 switch(type)
  74.                 {
  75.                         case 0 : 
  76.                                 ll.setBackgroundResource(R.drawable.call_locate_white);
  77.                                 break;
  78.                                 
  79.                         case 1 : 
  80.                                 ll.setBackgroundResource(R.drawable.call_locate_orange);
  81.                                 break;
  82.                                 
  83.                         case 2 : 
  84.                                 ll.setBackgroundResource(R.drawable.call_locate_green);
  85.                                 break;
  86.                                 
  87.                         case 3 : 
  88.                                 ll.setBackgroundResource(R.drawable.call_locate_blue);
  89.                                 break;
  90.                                 
  91.                         case 4 : 
  92.                                 ll.setBackgroundResource(R.drawable.call_locate_gray);
  93.                                 break;
  94.                                 
  95.                         default : 
  96.                                 break;
  97.                 }
  98.                 
  99.                 TextView tv = (TextView) view.findViewById(R.id.tv_show_location);
  100.                 tv.setText("归属地: " + address);
  101.                 windowManager.addView(view, params);
  102.         }
  103.         
  104.         //========================================================================
  105.         
  106.         private class MyPhoneListener extends PhoneStateListener
  107.         {
  108.                 @Override
  109.                 public void onCallStateChanged(int state, String incomingNumber)
  110.                 {
  111.                         super.onCallStateChanged(state, incomingNumber);
  112.                         
  113.                         switch(state)
  114.                         {
  115.                                 case TelephonyManager.CALL_STATE_IDLE : //空闲状态
  116.                                         if(view != null)
  117.                                         {
  118.                                                 windowManager.removeView(view);//移除显示归属地的那个view
  119.                                                 view = null;
  120.                                         }
  121.                                         break;
  122.                                         
  123.                                 case TelephonyManager.CALL_STATE_OFFHOOK : //接通电话
  124.                                         if(view != null)
  125.                                         {
  126.                                                 windowManager.removeView(view);//移除显示归属地的那个view
  127.                                                 view = null;
  128.                                         }
  129.                                         break;
  130.                                         
  131.                                 case TelephonyManager.CALL_STATE_RINGING : //铃响状态
  132.                                         String address = NumberAddressService.getAddress(incomingNumber);
  133.                                         showLocation(address);
  134.                                         break;
  135.                                         
  136.                                 default : 
  137.                                         break;
  138.                         }
  139.                 }
  140.         }

  141. }
复制代码
好啦,到现在为止,我们的显示风格还有显示位置就已经全部完成的啦!下次我们就会讲高级工具里面的黑名单功能的啦!  Security_15设置手机归属地的样式以及显示位置.rar (919.1 KB, 下载次数: 81) 
目录
相关文章
|
1月前
|
Java
【Java每日一题】— —第二十一题:编程把现实生活的手机事物映射成一个标准类Phone,并定义一个测试类PhoneDemo测试Phone类的功能
【Java每日一题】— —第二十一题:编程把现实生活的手机事物映射成一个标准类Phone,并定义一个测试类PhoneDemo测试Phone类的功能
36 0
|
1月前
|
安全 Java 数据库连接
【Java每日一题】——第四十四题:综合案例:编程模拟智能手机和普通手机功能。
【Java每日一题】——第四十四题:综合案例:编程模拟智能手机和普通手机功能。
44 0
|
1月前
|
数据挖掘 数据处理 API
使用TransBigData组件实现个人手机定位功能
使用TransBigData组件实现个人手机定位功能
21 0
|
2月前
|
Android开发
用Airtest快速实现手机文件读写与删除功能
用Airtest快速实现手机文件读写与删除功能
|
3月前
|
移动开发 JavaScript 前端开发
vue实现调用手机拍照、录像功能
vue实现调用手机拍照、录像功能
152 0
|
3月前
|
JavaScript 前端开发 iOS开发
移动端(vue)如何调用手机拨号功能
移动端(vue)如何调用手机拨号功能
|
4月前
|
传感器 物联网 Android开发
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
67 1
|
2月前
|
监控 安全 Android开发
【新手必读】Airtest测试Android手机常见的设置问题
【新手必读】Airtest测试Android手机常见的设置问题
|
4月前
|
XML Java Android开发
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
78 0
|
3月前
|
安全 网络协议 Linux
【公网远程手机Android服务器】安卓Termux搭建Web服务器
【公网远程手机Android服务器】安卓Termux搭建Web服务器
63 0

热门文章

最新文章