首先,先把我之前写的那个更新操作的一个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. private TextView tv_atool_query;
  32. private TextView tv_atool_number_service_state;
  33. private CheckBox cb_atool_state;
  34. private TextView tv_atool_select_bg;
  35. private TextView tv_atool_change_location;
  36. private Intent serviceIntent;
  37. private ProgressDialog pd;
  38. private SharedPreferences sp;
  39. @SuppressLint("HandlerLeak")
  40. private Handler handler = new Handler()
  41. {
  42. public void handleMessage(Message msg)
  43. {
  44. switch(msg.what)
  45. {
  46. case ERROR :
  47. Toast.makeText(AToolActivity.this, "下载数据库失败,请检查网络!", Toast.LENGTH_SHORT).show();
  48. break;
  49. case SUCCESS :
  50. Toast.makeText(AToolActivity.this, "数据库下载成功!", Toast.LENGTH_SHORT).show();
  51. break;
  52. default :
  53. break;
  54. }
  55. }
  56. };
  57. @Override
  58. protected void onCreate(Bundle savedInstanceState)
  59. {
  60. super.onCreate(savedInstanceState);
  61. setContentView(R.layout.atool);
  62. sp = getSharedPreferences("config", Context.MODE_PRIVATE);
  63. tv_atool_query = (TextView) findViewById(R.id.tv_atool_query);
  64. tv_atool_query.setOnClickListener(this);
  65. tv_atool_select_bg = (TextView) findViewById(R.id.tv_atool_select_bg);
  66. tv_atool_select_bg.setOnClickListener(this);
  67. tv_atool_change_location = (TextView) findViewById(R.id.tv_atool_change_location);
  68. tv_atool_change_location.setOnClickListener(this);
  69. tv_atool_number_service_state = (TextView) findViewById(R.id.tv_atool_number_service_state);
  70. cb_atool_state = (CheckBox) findViewById(R.id.cb_atool_state);
  71. serviceIntent = new Intent(this, AddressService.class);
  72. cb_atool_state.setOnCheckedChangeListener(new OnCheckedChangeListener()
  73. {
  74. @Override
  75. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
  76. {
  77. if(isChecked)
  78. {
  79. startService(serviceIntent);
  80. tv_atool_number_service_state.setTextColor(Color.BLACK);
  81. tv_atool_number_service_state.setText("归属地服务已开启");
  82. }
  83. else
  84. {
  85. stopService(serviceIntent);
  86. tv_atool_number_service_state.setTextColor(Color.RED);
  87. tv_atool_number_service_state.setText(R.string.number_service_state);
  88. }
  89. }
  90. });
  91. }
  92. @Override
  93. public void onClick(View v)
  94. {
  95. switch(v.getId())
  96. {
  97. case R.id.tv_atool_query :
  98. query();
  99. break;
  100. case R.id.tv_atool_select_bg :
  101. selectStyle();
  102. break;
  103. case R.id.tv_atool_change_location :
  104. Intent intent = new Intent(this, DragViewActivity.class);
  105. startActivity(intent);
  106. break;
  107. default :
  108. break;
  109. }
  110. }
  111. private void query()
  112. {
  113. if(isDBExist())
  114. {
  115. Intent intent = new Intent(this, QueryNumberActivity.class);
  116. startActivity(intent);
  117. }
  118. else
  119. {
  120. //提示用户下载数据库
  121. pd = new ProgressDialog(this);
  122. pd.setMessage("正在下载数据库...");
  123. pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  124. pd.setCancelable(false);
  125. pd.show();
  126. new Thread()
  127. {
  128. public void run()
  129. {
  130. String path = getResources().getString(R.string.serverdb);
  131. File dir = new File(Environment.getExternalStorageDirectory(), "/security/db");
  132. if(!dir.exists())
  133. {
  134. dir.mkdirs();
  135. }
  136. String dbPath = Environment.getExternalStorageDirectory() + "/security/db/data.db";
  137. try
  138. {
  139. //这个类,我们在做更新apk的时候已经写好的啦,现在直接拿过来用就可以啦
  140. DownloadTask.getFile(path, dbPath, pd);
  141. pd.dismiss();
  142. }
  143. catch (Exception e)
  144. {
  145. e.printStackTrace();
  146. pd.dismiss();
  147. Message message = new Message();
  148. message.what = ERROR;
  149. handler.sendMessage(message);
  150. }
  151. };
  152. }.start();
  153. }
  154. }
  155. private boolean isDBExist()
  156. {
  157. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
  158. {
  159. File file = new File(Environment.getExternalStorageDirectory() + "/security/db/data.db");
  160. if(file.exists())
  161. {
  162. return true;
  163. }
  164. }
  165. return false;
  166. }
  167. //显示风格的对话框,我准备了5张不同风格的背景图片,根据用户选择的风格不一样,设置不同的背景
  168. private void selectStyle()
  169. {
  170. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  171. builder.setTitle("归属地显示风格");
  172. String[] items = new String[] {"半透明", "活力橙", "苹果绿", "孔雀蓝", "金属灰"};
  173. builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener()
  174. {
  175. @Override
  176. public void onClick(DialogInterface dialog, int which)
  177. {
  178. Editor editor = sp.edit();
  179. editor.putInt("background", which);
  180. editor.commit();
  181. }
  182. });
  183. builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
  184. {
  185. @Override
  186. public void onClick(DialogInterface dialog, int which)
  187. {
  188. }
  189. });
  190. builder.create().show();
  191. }
  192. }

复制代码

我们写了一个方法,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. private int startX;
  21. private int startY;
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState)
  24. {
  25. super.onCreate(savedInstanceState);
  26. requestWindowFeature(Window.FEATURE_NO_TITLE);
  27. setContentView(R.layout.drag_view);
  28. sp = getSharedPreferences("config", Context.MODE_PRIVATE);
  29. iv_drag_location = (ImageView) findViewById(R.id.iv_drag_location);
  30. iv_drag_location.setOnTouchListener(this);
  31. }
  32. @Override
  33. protected void onResume()
  34. {
  35. super.onResume();
  36. //加载上次移动的效果
  37. int x = sp.getInt("lastX", 0);
  38. int y = sp.getInt("lastY", 0);
  39. /*iv_drag_location.layout(iv_drag_location.getLeft() + x, iv_drag_location.getTop() + y,
  40. iv_drag_location.getRight() + x, iv_drag_location.getBottom() + y);
  41. iv_drag_location.invalidate();*/
  42. RelativeLayout.LayoutParams params = (LayoutParams) iv_drag_location.getLayoutParams();
  43. params.leftMargin = x;
  44. params.topMargin = y;
  45. iv_drag_location.setLayoutParams(params);
  46. }
  47. @Override
  48. public boolean onTouch(View v, MotionEvent event)
  49. {
  50. switch(v.getId())
  51. {
  52. case R.id.iv_drag_location :
  53. switch(event.getAction())
  54. {
  55. case MotionEvent.ACTION_DOWN :
  56. startX = (int) event.getRawX();
  57. startY = (int) event.getRawY();
  58. break;
  59. case MotionEvent.ACTION_MOVE :
  60. int x = (int) event.getRawX();
  61. int y = (int) event.getRawY();
  62. //算出移动距离
  63. int dx = x - startX;
  64. int dy = y - startY;
  65. int l = iv_drag_location.getLeft();
  66. int r = iv_drag_location.getRight();
  67. int t = iv_drag_location.getTop();
  68. int b = iv_drag_location.getBottom();
  69. //设置新的布局位置
  70. iv_drag_location.layout(l + dx, t + dy, r + dx, b + dy);
  71. //重新获取位置
  72. startX = (int) event.getRawX();
  73. startY = (int) event.getRawY();
  74. break;
  75. case MotionEvent.ACTION_UP :
  76. int lastX = iv_drag_location.getLeft();
  77. int lastY = iv_drag_location.getTop();
  78. Editor editor = sp.edit();
  79. editor.putInt("lastX", lastX);
  80. editor.putInt("lastY", lastY);
  81. editor.commit();
  82. break;
  83. default :
  84. break;
  85. }
  86. break;
  87. default :
  88. break;
  89. }
  90. return true;
  91. }
  92. }

复制代码

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

复制代码

好啦,到现在为止,我们的显示风格还有显示位置就已经全部完成的啦!下次我们就会讲高级工具里面的黑名单功能的啦!  Security_15设置手机归属地的样式以及显示位置.rar (919.1 KB, 下载次数: 81)

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

  1. 手机来电秀怎么开启_360手机卫士怎么设置来电秀 360手机卫士来电秀设置方法...

    360手机卫士除了防护等安全功能外,它的来电秀也是比较火热的,很多朋友都喜欢在这里设置自己别具个性的来电秀,这篇文章就一起了解一下360手机卫士怎么设置来电秀. 360手机卫士来电秀设置是在[隐私保护 ...

  2. android x86主动防御,360手机卫士首家实现X86架构手机主动防御

    联想昨天在北京正式发布Intel双核旗舰手机K900.X86架构的手机同时也得到广泛关注.记者刚刚获悉,360手机卫士最新版已率先完美支持英特尔 X86架构手机.据业内专家介绍,安全软件一些核心功能需 ...

  3. android 主动防御,360手机卫士首家实现X86架构手机主动防御

    联想昨天在北京正式发布Intel双核旗舰手机K900.X86架构的手机同时也得到广泛关注.记者刚刚获悉,360手机卫士最新版已率先完美支持英特尔 X86架构手机.据业内专家介绍,安全软件一些核心功能需 ...

  4. [android] 手机卫士号码归属地查询

    使用小米号码归属地数据库,有两张表data1和data2 先查询data1表,把手机号码截取前7位 select outkey from data1 where id="前七位手机号&quo ...

  5. 金山手机卫士论坛_三星多款手机黑屏系统崩溃 客服:闰4月BUG,无法保证数据不丢失...

    日前三星手机多款机型出现黑屏和大面积重启问题,用户纷纷排队维修,一位用户称,维修后手机里上千张女儿的照片全没了.客服表示是农历闰4月计算逻辑错误导致,升级后无法保证数据不丢失. 三星客服称,目前只能先 ...

  6. 百度手机卫士联手央视3·15大数据分析 女性、老年人易遭电信诈骗

    前天是3·15消费者权益日,央视财经频道<3·15在行动>节目关注了日益猖獗的电信诈骗问题.节目中,百度手机卫士向消费者揭露了十大类典型的诈骗短信类型,并对伪基站骗术进行了揭露. 央视报道 ...

  7. Android项目实战--手机卫士

    Android项目实战--手机卫士--结束 很久都没有来更新博客了,之前一直忙着工作的事,接触到了一些以前从来没有接触过的东西,真的挺有挑战性的,但也有很多的无奈,但也学习到了很多东西,我会慢慢的写到 ...

  8. i9500android操作系统跑流量,手机流量去哪了 横评显示360手机卫士成节流王

    今年两会期间,加快4G建设.下调天价资费等话题成为热门议题,手机流量关注度在日益提高.而当前,市面上有不少流量监控软件均号称能省流量,但到底谁才是4G时代下的必备品呢?为此,我们从其中甄选出三款较常见 ...

  9. 金山android 杀毒软件,金山手机卫士

    金山手机卫士正式版是款专门为安卓手机安全所打造的手机保护工具.金山手机卫士最新版中通过检查系统漏洞,扫描风险软件,检查扣费记录等解除您的手机安全隐患,保证Android手机及话费安全.金山手机卫士同时 ...

  10. 360 android系统 流量,360手机卫士Android版增流量监控

    2011-3-15 10:52 [天极网IT新闻频道]目前,随着Android手机系统大热,低价智能手机越来越普及,而智能机最大的特点就是软件丰富和可随时随地可以上网.地铁里发微博,看新闻甚至看视频都 ...

最新文章

  1. IT风险的防控水平是一个“木桶”原理
  2. Android ListView 横向滑动删除 Item
  3. sublime配置攻略
  4. 台湾国立大学郭彦甫Matlab教程笔记(14)polynomial differentiation多项式微分
  5. linux can 接收多帧_CAN编程介绍
  6. hdu 2255二分图最大权值匹配的KM 算法
  7. MongoDB副本集配置系列四:节点的关闭顺序
  8. dhcp服务器能为客户端提供哪些信息,为DHCP客户端提供DHCP服务器的MAC [关闭]
  9. 贪小便宜的人交不得,否则,可能会因小失大
  10. bool型数组python_Python bool()
  11. python框架之Flask(4)-上下文管理
  12. 酷q点歌机器人软件_酷q_酷q机器人官方下载[最新版]-下载之家
  13. Unity3D脚本编程读书笔记——第2章 Mono脚本核心基础
  14. word添加目录和更新
  15. MATLAB伽罗域是什么,利用伽罗华域的运算来计算生成矩阵
  16. Angular +Ionic实现关注与取消关注
  17. 【转载】专利翻译常用词句
  18. 7-1 换硬币(20 分)
  19. python能开发安卓app吗_如何Python写一个安卓APP
  20. 功耗大好还是小好_热设计功耗高好还是低好 - 卡饭网

热门文章

  1. 换汤不换药,苹果新系统对于降频仍无“疗效”?
  2. java排序:冒泡排序和快速排序
  3. 用java语言写冒泡排序
  4. java 项目自动部署shell脚本
  5. Python 爬取图虫网图片
  6. 蚂蚁花呗被盗刷怎么办?
  7. 星起航:抖音电商搜索流量至关重要
  8. Java迭代器和Collection接口
  9. linux修改sftp端口的方法:2个地方需要修改
  10. Git Flow最佳实践