編輯:關於Android編程
這幾天的項目不是很緊,於是想為未來可能要做的項目做一些技術儲備。
下一個項目很有可能是定位開發,需要用到手機定位功能,於是查了查現在比較流行的第三方定位,最火的基本上就是百度定位>高德定位>騰訊定位了。
想了想不如做一個DEMO把三種定位方式混合一下試試。
BaiduLocTool.java
package com.dhcc.mixlocation;
import android.content.Context;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
public class BaiduLocTool implements BDLocationListener{
public LocationClient mLocationClient;
public LocationClient getmLocationClient() {
return mLocationClient;
}
private Context mContext;
public BaiduLocTool(Context context){
mContext=context;
}
public void init(){
mLocationClient = new LocationClient(mContext);
InitLocation();
mLocationClient.registerLocationListener(this);
mLocationClient.start();
}
private void InitLocation(){
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//設置定位模式
option.setScanSpan(1000);//設置發起定位請求的間隔時間為5000ms
option.setIsNeedAddress(true);
mLocationClient.setLocOption(option);
}
@Override
public void onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
((MainActivity)mContext).phoneCall(百度定位:+緯度:+location.getLatitude()+ | +經度:+location.getLongitude()+ | +反地理編碼:+location.getAddrStr());
mLocationClient.stop();
}
public void destroyLocManager(){
if(mLocationClient!=null)
mLocationClient.stop();
mLocationClient=null;
}
}
GaodeLocTool.java
package com.dhcc.mixlocation;
import android.content.Context;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.LocationManagerProxy;
import com.amap.api.location.LocationProviderProxy;
public class GaodeLocTool implements AMapLocationListener{
Context mContext;
private LocationManagerProxy mLocationManagerProxy;
public GaodeLocTool(Context context){
this.mContext=context;
}
public void init(){
mLocationManagerProxy = LocationManagerProxy.getInstance(mContext);
mLocationManagerProxy.requestLocationData(
LocationProviderProxy.AMapNetwork, 1000, 15, this);
mLocationManagerProxy.setGpsEnable(true);
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
Log.e(onLocationChanged, Location);
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
Log.e(onProviderDisabled, onProviderDisabled);
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
Log.e(onProviderEnabled, onProviderEnabled);
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
Log.e(onStatusChanged, onStatusChanged);
}
@Override
public void onLocationChanged(AMapLocation location) {
// TODO Auto-generated method stub
Log.e(onLocationChanged, AMapLocation);
((MainActivity)mContext).phoneCall(高德定位:+混合定位方式:+location.getProvider()+ | +緯度:+location.getLatitude()+ | +經度:+location.getLongitude()+ | +反地理編碼:+location.getAddress());
mLocationManagerProxy.removeUpdates(this);
}
public void destroyLocManager() {
if (mLocationManagerProxy != null) {
mLocationManagerProxy.removeUpdates(this);
mLocationManagerProxy.destroy();
}
mLocationManagerProxy = null;
}
}
package com.dhcc.mixlocation;
import android.content.Context;
import android.util.Log;
import com.tencent.map.geolocation.TencentLocation;
import com.tencent.map.geolocation.TencentLocationListener;
import com.tencent.map.geolocation.TencentLocationManager;
import com.tencent.map.geolocation.TencentLocationRequest;
public class TecentLocTool implements TencentLocationListener {
String LocInfo;
String task;
Context main;
TencentLocationManager mLocationManager;
public String getLocInfo() {
return LocInfo;
}
public void setLocInfo(String locInfo) {
LocInfo = locInfo;
}
public TecentLocTool(Context main) {
this.main = main;
mLocationManager=TencentLocationManager.getInstance(main);
}
public void init(){
int error = TencentLocationManager.getInstance(main)
.requestLocationUpdates(
TencentLocationRequest
.create().setInterval(5000)
.setRequestLevel(
TencentLocationRequest.REQUEST_LEVEL_NAME), this);
if (error == 0) {
Log.e(監聽狀態:, 監聽成功!);
} else if (error == 1) {
Log.e(監聽狀態:, 設備缺少使用騰訊定位SDK需要的基本條件);
} else if (error == 2) {
Log.e(監聽狀態:, 配置的 key 不正確);
}
}
/**
* @param location
* 新的位置
* @param error
* 錯誤碼
* @param reason
* 錯誤描述
*/
@Override
public void onLocationChanged(TencentLocation location, int error,
String reason) {
// TODO Auto-generated method stub
if (TencentLocation.ERROR_OK == error) {
double lat = location.getLatitude();// 緯度
double lot = location.getLongitude();// 經度
double altitude = location.getAltitude();// 海拔
float accuracy = location.getAccuracy();// 精度
String nation = location.getNation();// 國家
String province = location.getProvince();// 省份
String city = location.getCity();// 城市
String district = location.getDistrict();// 區
String town = location.getTown();// 鎮
String village = location.getVillage();// 村
String street = location.getStreet();// 街道
String streetNo = location.getStreetNo();// 門號
Log.e(定位信息:, lat + | + lot + | + altitude + |
+ accuracy + | + nation + | + province + |
+ city + | + district + | + town + | + village
+ | + street + | + streetNo);
task = lat + | + lot + | + altitude + | + accuracy
+ | + nation + | + province + | + city + |
+ district + | + town + | + village + |
+ street + | + streetNo + | ;
String provider=location.getProvider();//定位方式
if (TencentLocation.GPS_PROVIDER.equals(provider)) {
// location 是GPS定位結果
Log.e(定位方式:,GPS);
((MainActivity)main).phoneCall(騰訊定位:+task+GPS);
} else if (TencentLocation.NETWORK_PROVIDER.equals(provider)) {
// location 是網絡定位結果
Log.e(定位方式:,NetWork);
((MainActivity)main).phoneCall(騰訊定位:+task+NetWork+ | +location.getAddress());
Log.e(地址:, location.getAddress());
}
mLocationManager.removeUpdates(this);
} else {
Log.e(reason:, reason);
Log.e(error:, error + );
}
}
/**
* @param name
* GPS,Wi-Fi等
* @param status
* 新的狀態, 啟用或禁用
* @param desc
* 狀態描述
*/
@Override
public void onStatusUpdate(String name, int status, String desc) {
// TODO Auto-generated method stub
Log.e(name:, name);
Log.e(status:, +status);
Log.e(desc:, desc);
}
public void destroyLocManager() {
if(mLocationManager!=null)
mLocationManager.removeUpdates(this);
mLocationManager=null;
}
}
百度地圖:沒什麼問題,用起來很方便。
高德地圖:LocationProviderProxy.AMapNetwork 只支持網絡定位,無法純GPS定位,如果想要純GPS定位就必須把這個參數改成LocationManagerProxy.GPS_PROVIDER。很蛋疼,這裡需要自己來邏輯判斷一下。
騰訊地圖:如果想要純GPS定位的話,需要把定位坐標改成地球坐標:mLocationManager.setCoordinateType(TencentLocationManager.COORDINATE_TYPE_WGS84);
但是面臨的問題是這個坐標沒法反地理編碼。如果想反地理編碼,就必須把坐標改成火星坐標,mLocationManager.setCoordinateType(TencentLocationManager.COORDINATE_TYPE_GCJ02);
但是這樣又沒法純GPS定位,所以我個人覺得騰訊定位只要用他的網絡定位就好了,不要用他的GPS定位了 好麻煩。
在我所在的位置測試的話,三種定位的網絡定位,反地理編碼最准確的是:騰訊定位,其次是百度定位,最差的是高德定位。
Android熱補丁動態修復實踐
前言好幾個月之前關於Android App熱補丁修復火了一把,源於QQ空間團隊的一篇文章安卓App熱補丁動態修復技術介紹,然後各大廠的開源項目都出來了,本文的實踐基於Ho
Android-Activity程序動態的生成表格布局管理器
.java代碼如下: package org.lxh.demo; import android.app.Activity; import android
Android 程序應用的生命周期
程序應用步驟:打開應用:onCreateonStartonResumeBACK鍵:onPauseonStoponDestoryHOME鍵:onPauseonStop再次啟
Android實現Gesture手勢識別用法分析
本文實例分析了Android實現Gesture手勢識別用法。分享給大家供大家參考。具體如下:很高興能在Android1.6的sdk看到手勢識別這一功能,之前一直在想,如何