天天看点

Android 手机定位调用方法

android手机定位在中国还是有些坑的。

首先android的定位方式分为三种:GPS,NET_WORK,PASSIVE

具体问题代码见:

1.获取定位管理服务:

LocationManager mgLocation=(LocationManager)MainActivity.this.getSystemService(Context.LOCATION_SERVICE);

2.获取定位

//GPS定位

Location location_1=mgLocation.getLastKnownLocation(LocationManager.GPS_PROVIDER);

//网络基站定位

Location location_2=mgLocation.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

//手机服务商定位

Location location_3=mgLocation.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);

其中坑的是GPS定位,在中国,你在室内开发时,你的手机根本就没法获取位置信息

如果想通过精确的GPS获取定位需要结合百度SDK,百度地图,高德地图等协同显示

获取权限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-permission android:name="android.permission.INTERNET" />

//设定实时定位间隔

mgLocation.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 1000, 0, MainActivity.this);

//其中MainActivity.this表示的是LocationListener,

因为:

MainActivity extends Activity implements LocationListener

//复写方法:

@Override

public void onLocationChanged(Location location)

location为定位成功后的位置

打开手机GPS的Intent:

Intent intent=new Intent();

intent.setAction(Setting.Action_LOCATION_SOURCE_SETTINGS);

startActivity(intent);

最后介绍一下通过WIFI定位:

首先获取wifi的mac地址

然后将mac地址发送给google,获取google分析过来的地理位置

public

classWiFiInfoManager

implements

Serializable {

private

static

final

long

serialVersionUID= -4582739827003032383L;

private

Context context;

public

WiFiInfoManager(Context context) {

super

();

this

.context = context;

}

public

WifiInfo getWifiInfo() {

WifiManager manager = (WifiManager)context

.getSystemService(Context.WIFI_SERVICE);

WifiInfo info =

new

WifiInfo();

info.mac =manager.getConnectionInfo().getBSSID();

Log.i( TAG , WIFI MACis: + info.mac);

return

info;

}

public

class

WifiInfo {

public

String mac;

public

WifiInfo() {

super

();

}

}

}

         public

staticLocation getWIFILocation(WifiInfo wifi) {

if

(wifi ==

null

) {

Log.i( TAG , wifiis

null

. );

return

null

;

}

DefaultHttpClient client = newDefaultHttpClient();

HttpPost post =

new

HttpPost( http:

//www.google.com/loc/json );

JSONObject holder =

new

JSONObject();

try

{

holder.put( version ,

1.1

.

);

holder.put( host , maps.google.com );

JSONObject data;

JSONArray array =

new

JSONArray();

if

(wifi.mac !=

null

wifi.mac.trim().length() 

) {

data =

new

JSONObject();

data.put( mac_address , wifi.mac);

data.put( signal_strength ,

8

);

data.put( age ,

);

array.put(data);

}

holder.put( wifi_towers ,array);

Log.i( TAG , request json: + holder.toString());

StringEntity se = newStringEntity(holder.toString());

post.setEntity(se);

HttpResponse resp =client.execute(post);

int

state =resp.getStatusLine().getStatusCode();

if

(state == HttpStatus.SC_OK) {

HttpEntity entity =resp.getEntity();

if

(entity !=

null

) {

BufferedReader br = newBufferedReader(

newInputStreamReader(entity.getContent()));

StringBuffer sb = newStringBuffer();

String resute = ;

while

((resute =br.readLine()) !=

null

) {

sb.append(resute);

}

br.close();

Log.i( TAG , response json: + sb.toString());

data = newJSONObject(sb.toString());

data = (JSONObject)data.get( location );

Location loc = newLocation(

android.location.LocationManager.NETWORK_PROVIDER);

loc.setLatitude((Double)data.get( latitude ));

loc.setLongitude((Double)data.get( longitude ));

loc.setAccuracy(Float.parseFloat(data.get( accuracy )

.toString()));

loc.setTime(System.currentTimeMillis());

return

loc;

}

else

{

return

null

;

}

}

else

{

Log.v( TAG , state + );

return

null

;

}

}

catch

(Exception e) {

Log.e( TAG ,e.getMessage());

return

null

;

}

}

上面这个方法仅作为学习使用,因为伟大的墙的原因,google 的网站我们是连不上去滴

注:

LocationManager.PASSIVE_PROVIDER定位貌似只能使用一次,不能连续监听,下次使用还需要重新调用方法

具体并未尝试太多,有新发现可以共同讨论