537
汽車大全
手機衛士15-歸屬地界麵和手機定位功能
首先,先把我之前寫的那個更新操作的一個bug修複先,這個bug就是在Android4以上,我們已經不能在主線程裏麵進行網絡操作的啦,如果進行網絡操作,就會報錯
所以我們就要做一下改動,我們在onCreate方法裏麵開啟一個線程,用來檢測更新信息的
-
<font color="#333333"><font face="Arial"> new Thread()
-
{
-
public void run()
-
{
-
try
-
{
-
UpdateInfoService updateInfoService = new UpdateInfoService(SplashActivity.this);
-
info = updateInfoService.getUpdateInfo(R.string.serverUrl);
-
}
-
catch (Exception e)
-
{
-
e.printStackTrace();
-
}
-
};
- }.start();</font></font>
-
<font color="#333333"><font face="Arial"> private boolean isNeedUpdate(String version)
-
{
-
if(info == null)
-
{
-
Toast.makeText(this, "獲取更新信息異常,請稍後再試", Toast.LENGTH_SHORT).show();
-
loadMainUI();
-
return false;
-
}
-
String v = info.getVersion();
-
if(v.equals(version))
-
{
-
Log.i(TAG, "當前版本:" + version);
-
Log.i(TAG, "最新版本:" + v);
-
loadMainUI();
-
return false;
-
}
-
else
-
{
-
Log.i(TAG, "需要更新");
-
return true;
-
}
- }</font></font>




-
package com.xiaobin.security.ui;
-
-
import java.io.File;
-
-
import android.annotation.SuppressLint;
-
import android.app.Activity;
-
import android.app.AlertDialog;
-
import android.app.ProgressDialog;
-
import android.content.Context;
-
import android.content.DialogInterface;
-
import android.content.Intent;
-
import android.content.SharedPreferences;
-
import android.content.SharedPreferences.Editor;
-
import android.graphics.Color;
-
import android.os.Bundle;
-
import android.os.Environment;
-
import android.os.Handler;
-
import android.os.Message;
-
import android.view.View;
-
import android.view.View.OnClickListener;
-
import android.widget.CheckBox;
-
import android.widget.CompoundButton;
-
import android.widget.CompoundButton.OnCheckedChangeListener;
-
import android.widget.TextView;
-
import android.widget.Toast;
-
-
import com.xiaobin.security.R;
-
import com.xiaobin.security.engine.DownloadTask;
-
import com.xiaobin.security.service.AddressService;
-
-
public class AToolActivity extends Activity implements OnClickListener
-
{
-
private static final int ERROR = 0;
-
private static final int SUCCESS = 1;
-
-
private TextView tv_atool_query;
-
private TextView tv_atool_number_service_state;
-
private CheckBox cb_atool_state;
-
private TextView tv_atool_select_bg;
-
private TextView tv_atool_change_location;
-
private Intent serviceIntent;
-
private ProgressDialog pd;
-
-
private SharedPreferences sp;
-
-
@SuppressLint("HandlerLeak")
-
private Handler handler = new Handler()
-
{
-
public void handleMessage(Message msg)
-
{
-
switch(msg.what)
-
{
-
case ERROR :
-
Toast.makeText(AToolActivity.this, "下載數據庫失敗,請檢查網絡!", Toast.LENGTH_SHORT).show();
-
break;
-
-
case SUCCESS :
-
Toast.makeText(AToolActivity.this, "數據庫下載成功!", Toast.LENGTH_SHORT).show();
-
break;
-
-
default :
-
break;
-
}
-
}
-
};
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.atool);
-
-
sp = getSharedPreferences("config", Context.MODE_PRIVATE);
-
-
tv_atool_query = (TextView) findViewById(R.id.tv_atool_query);
-
tv_atool_query.setOnClickListener(this);
-
-
tv_atool_select_bg = (TextView) findViewById(R.id.tv_atool_select_bg);
-
tv_atool_select_bg.setOnClickListener(this);
-
-
tv_atool_change_location = (TextView) findViewById(R.id.tv_atool_change_location);
-
tv_atool_change_location.setOnClickListener(this);
-
-
tv_atool_number_service_state = (TextView) findViewById(R.id.tv_atool_number_service_state);
-
cb_atool_state = (CheckBox) findViewById(R.id.cb_atool_state);
-
serviceIntent = new Intent(this, AddressService.class);
-
cb_atool_state.setOnCheckedChangeListener(new OnCheckedChangeListener()
-
{
-
@Override
-
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
-
{
-
if(isChecked)
-
{
-
startService(serviceIntent);
-
tv_atool_number_service_state.setTextColor(Color.BLACK);
-
tv_atool_number_service_state.setText("歸屬地服務已開啟");
-
}
-
else
-
{
-
stopService(serviceIntent);
-
tv_atool_number_service_state.setTextColor(Color.RED);
-
tv_atool_number_service_state.setText(R.string.number_service_state);
-
}
-
}
-
});
-
}
-
-
@Override
-
public void onClick(View v)
-
{
-
switch(v.getId())
-
{
-
case R.id.tv_atool_query :
-
query();
-
break;
-
-
case R.id.tv_atool_select_bg :
-
selectStyle();
-
break;
-
-
case R.id.tv_atool_change_location :
-
Intent intent = new Intent(this, DragViewActivity.class);
-
startActivity(intent);
-
break;
-
-
default :
-
break;
-
}
-
}
-
-
private void query()
-
{
-
if(isDBExist())
-
{
-
Intent intent = new Intent(this, QueryNumberActivity.class);
-
startActivity(intent);
-
}
-
else
-
{
-
//提示用戶下載數據庫
-
pd = new ProgressDialog(this);
-
pd.setMessage("正在下載數據庫...");
-
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
-
pd.setCancelable(false);
-
pd.show();
-
new Thread()
-
{
-
public void run()
-
{
-
String path = getResources().getString(R.string.serverdb);
-
File dir = new File(Environment.getExternalStorageDirectory(), "/security/db");
-
if(!dir.exists())
-
{
-
dir.mkdirs();
-
}
-
String dbPath = Environment.getExternalStorageDirectory() + "/security/db/data.db";
-
try
-
{
-
//這個類,我們在做更新apk的時候已經寫好的啦,現在直接拿過來用就可以啦
-
DownloadTask.getFile(path, dbPath, pd);
-
pd.dismiss();
-
}
-
catch (Exception e)
-
{
-
e.printStackTrace();
-
pd.dismiss();
-
Message message = new Message();
-
message.what = ERROR;
-
handler.sendMessage(message);
-
}
-
};
-
}.start();
-
}
-
}
-
-
private boolean isDBExist()
-
{
-
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
-
{
-
File file = new File(Environment.getExternalStorageDirectory() + "/security/db/data.db");
-
if(file.exists())
-
{
-
return true;
-
}
-
}
-
return false;
-
}
-
-
//顯示風格的對話框,我準備了5張不同風格的背景圖片,根據用戶選擇的風格不一樣,設置不同的背景
-
private void selectStyle()
-
{
-
AlertDialog.Builder builder = new AlertDialog.Builder(this);
-
builder.setTitle("歸屬地顯示風格");
-
String[] items = new String[] {"半透明", "活力橙", "蘋果綠", "孔雀藍", "金屬灰"};
-
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener()
-
{
-
@Override
-
public void onClick(DialogInterface dialog, int which)
-
{
-
Editor editor = sp.edit();
-
editor.putInt("background", which);
-
editor.commit();
-
}
-
});
-
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
-
{
-
@Override
-
public void onClick(DialogInterface dialog, int which)
-
{
-
-
}
-
});
-
builder.create().show();
-
}
-
-
}
-
package com.xiaobin.security.ui;
-
-
import android.app.Activity;
-
import android.content.Context;
-
import android.content.SharedPreferences;
-
import android.content.SharedPreferences.Editor;
-
import android.os.Bundle;
-
import android.view.MotionEvent;
-
import android.view.View;
-
import android.view.View.OnTouchListener;
-
import android.view.Window;
-
import android.widget.ImageView;
-
import android.widget.RelativeLayout;
-
import android.widget.RelativeLayout.LayoutParams;
-
-
import com.xiaobin.security.R;
-
-
public class DragViewActivity extends Activity implements OnTouchListener
-
{
-
private ImageView iv_drag_location;
-
private SharedPreferences sp;
-
-
//記錄第一次觸摸的坐標
-
private int startX;
-
private int startY;
-
-
@Override
-
protected void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
requestWindowFeature(Window.FEATURE_NO_TITLE);
-
setContentView(R.layout.drag_view);
-
-
sp = getSharedPreferences("config", Context.MODE_PRIVATE);
-
-
iv_drag_location = (ImageView) findViewById(R.id.iv_drag_location);
-
iv_drag_location.setOnTouchListener(this);
-
}
-
-
@Override
-
protected void onResume()
-
{
-
super.onResume();
-
-
//加載上次移動的效果
-
int x = sp.getInt("lastX", 0);
-
int y = sp.getInt("lastY", 0);
-
/*iv_drag_location.layout(iv_drag_location.getLeft() + x, iv_drag_location.getTop() + y,
-
iv_drag_location.getRight() + x, iv_drag_location.getBottom() + y);
-
iv_drag_location.invalidate();*/
-
RelativeLayout.LayoutParams params = (LayoutParams) iv_drag_location.getLayoutParams();
-
params.leftMargin = x;
-
params.topMargin = y;
-
iv_drag_location.setLayoutParams(params);
-
}
-
-
@Override
-
public boolean onTouch(View v, MotionEvent event)
-
{
-
switch(v.getId())
-
{
-
case R.id.iv_drag_location :
-
switch(event.getAction())
-
{
-
case MotionEvent.ACTION_DOWN :
-
startX = (int) event.getRawX();
-
startY = (int) event.getRawY();
-
break;
-
-
case MotionEvent.ACTION_MOVE :
-
int x = (int) event.getRawX();
-
int y = (int) event.getRawY();
-
-
//算出移動距離
-
int dx = x - startX;
-
int dy = y - startY;
-
int l = iv_drag_location.getLeft();
-
int r = iv_drag_location.getRight();
-
int t = iv_drag_location.getTop();
-
int b = iv_drag_location.getBottom();
-
-
//設置新的布局位置
-
iv_drag_location.layout(l + dx, t + dy, r + dx, b + dy);
-
-
//重新獲取位置
-
startX = (int) event.getRawX();
-
startY = (int) event.getRawY();
-
break;
-
-
case MotionEvent.ACTION_UP :
-
int lastX = iv_drag_location.getLeft();
-
int lastY = iv_drag_location.getTop();
-
Editor editor = sp.edit();
-
editor.putInt("lastX", lastX);
-
editor.putInt("lastY", lastY);
-
editor.commit();
-
break;
-
-
default :
-
break;
-
}
-
break;
-
-
default :
-
break;
-
}
-
return true;
-
}
-
-
}
-
package com.xiaobin.security.service;
-
-
import android.app.Service;
-
import android.content.Context;
-
import android.content.Intent;
-
import android.content.SharedPreferences;
-
import android.graphics.PixelFormat;
-
import android.os.IBinder;
-
import android.telephony.PhoneStateListener;
-
import android.telephony.TelephonyManager;
-
import android.view.Gravity;
-
import android.view.View;
-
import android.view.WindowManager;
-
import android.widget.LinearLayout;
-
import android.widget.TextView;
-
-
import com.xiaobin.security.R;
-
import com.xiaobin.security.engine.NumberAddressService;
-
-
public class AddressService extends Service
-
{
-
private TelephonyManager telephonyManager;
-
private MyPhoneListener listener;
-
private WindowManager windowManager;
-
private View view;
-
-
private SharedPreferences sp;
-
-
@Override
-
public IBinder onBind(Intent intent)
-
{
-
return null;
-
}
-
-
@Override
-
public void onCreate()
-
{
-
super.onCreate();
-
-
sp = getSharedPreferences("config", Context.MODE_PRIVATE);
-
-
windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
-
listener = new MyPhoneListener();
-
telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
-
telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
-
}
-
-
@Override
-
public void onDestroy()
-
{
-
super.onDestroy();
-
//停止監聽
-
telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE);
-
}
-
-
//顯示歸屬地的窗體
-
private void showLocation(String address)
-
{
-
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
-
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
-
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
-
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE //無法獲取焦點
-
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE //無法點擊
-
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;//保持屏幕亮
-
params.format = PixelFormat.TRANSLUCENT;//設置成半透明的
-
params.type = WindowManager.LayoutParams.TYPE_TOAST;
-
params.setTitle("Toast");
-
-
//主要是確定坐標係是從左上角開始的,不然呆會設置位置的時候有些麻煩
-
params.gravity = Gravity.LEFT | Gravity.TOP;
-
params.x = sp.getInt("lastX", 0);
-
params.y = sp.getInt("lastY", 0);
-
-
view = View.inflate(getApplicationContext(), R.layout.show_location, null);
-
LinearLayout ll = (LinearLayout) view.findViewById(R.id.ll_location);
-
int type = sp.getInt("background", 0);
-
switch(type)
-
{
-
case 0 :
-
ll.setBackgroundResource(R.drawable.call_locate_white);
-
break;
-
-
case 1 :
-
ll.setBackgroundResource(R.drawable.call_locate_orange);
-
break;
-
-
case 2 :
-
ll.setBackgroundResource(R.drawable.call_locate_green);
-
break;
-
-
case 3 :
-
ll.setBackgroundResource(R.drawable.call_locate_blue);
-
break;
-
-
case 4 :
-
ll.setBackgroundResource(R.drawable.call_locate_gray);
-
break;
-
-
default :
-
break;
-
}
-
-
TextView tv = (TextView) view.findViewById(R.id.tv_show_location);
-
tv.setText("歸屬地: " + address);
-
windowManager.addView(view, params);
-
}
-
-
//========================================================================
-
-
private class MyPhoneListener extends PhoneStateListener
-
{
-
@Override
-
public void onCallStateChanged(int state, String incomingNumber)
-
{
-
super.onCallStateChanged(state, incomingNumber);
-
-
switch(state)
-
{
-
case TelephonyManager.CALL_STATE_IDLE : //空閑狀態
-
if(view != null)
-
{
-
windowManager.removeView(view);//移除顯示歸屬地的那個view
-
view = null;
-
}
-
break;
-
-
case TelephonyManager.CALL_STATE_OFFHOOK : //接通電話
-
if(view != null)
-
{
-
windowManager.removeView(view);//移除顯示歸屬地的那個view
-
view = null;
-
}
-
break;
-
-
case TelephonyManager.CALL_STATE_RINGING : //鈴響狀態
-
String address = NumberAddressService.getAddress(incomingNumber);
-
showLocation(address);
-
break;
-
-
default :
-
break;
-
}
-
}
-
}
-
-
}

最後更新:2017-04-03 12:53:36