您的位置:首页 > 移动开发 > Android开发

Android开发获取GPS位置,包含基站\wifi\gps 几种方法

2015-12-28 14:58 513 查看
一部分:几种定位简述

1.gps定位:

优点:最简单的手机定位方式当然是通过GPS模块(现在大部分的智能机应该都有了)。GPS方式准确度是最高的
缺点1.比较耗电;
2.绝大部分用户默认不开启GPS模块;
3.从GPS模块启动到获取第一次定位数据,可能需要比较长的时间;
4.室内几乎无法使用。
这其中,缺点2,3都是比较致命的。需要指出的是,GPS走的是卫星通信的通道,在没有网络连接的情况下也能用。

有网络、室内不可用、定位时间长、位置精确

2.基站定位
大致思路就是采集到手机上的基站ID号(cellid)和其它的一些信息(MNC,MCC,LAC等等),然后通过网络访问一些定位服务,获取 并返回对应的经纬度坐标。基站定位的精确度不如GPS,好处是能够在室内用,只要网络通畅就行。

有网络 室内可用 定位方式不精确

3.WIFI定位
和基站定位类似,这种方式是通过获取当前所用的wifi的一些信息,然后访问网络上的定位服务以获得经纬度坐标。因为它和基站定位其实都需要使 用网络,所以在Android也统称为Network方式。

与基站定位类似

4.AGPS定位

最后需要解释一点的是AGPS方式。很多人将它和基站定位混为一谈,但其实AGPS的本质仍然是GPS,只是它会使用基站信息对获取GPS进行辅助,然后 还能对获取到的GPS结果进行修正,所以AGPS要比传统的GPS更快,准确度略高。

有网络、类似gps定位、但比传统Gps定位更快,准确度略高

第二部分:
locationManager.getLastKnownLocation()总是会出现取不到数据的情况,所以这里没有使用这个方法,避免 了取不到数据的问题

第三部分:使用异步加载,提高性能

================================代码===========================





4000
1.Activity

[java] view
plaincopy

package com.example.gpsdemo;

import com.example.gpsdemo.util.GetLocation;

import com.example.gpsdemo.util.LMLocation;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.ProgressDialog;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends Activity {

LMLocation lmLocation;

TextView textView;

public MainActivity instance;

private AlertDialog dialog;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView = (TextView) findViewById(R.id.textView2);

instance = this;

dialog = new ProgressDialog(MainActivity.this);

dialog.setTitle("请稍等...");

dialog.setMessage("正在定位...");

Button button = (Button) findViewById(R.id.button1);

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

new GetLocation(dialog, textView, instance).DisplayLocation();

}

});

}

}

2.与MainActivity对应的布局

[html] view
plaincopy

<xmlns:toolsxmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<android:idandroid:id="@+id/textView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:padding="@dimen/padding_medium"

android:text="@string/hello_world"

tools:context=".MainActivity" />

<android:idandroid:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_alignRight="@+id/textView2"

android:layout_marginRight="52dp"

android:text="定位" />

3.AndroidManifest.xml

package="com.example.gpsdemo"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk< li="">
android:minSdkVersion="8"
android:targetSdkVersion="15" />

<application< li="">
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity< li="">
android:name=".MainActivity"
android:label="@string/title_activity_main" >

4.工具类两个:(1)

[java] view
plaincopy

package com.example.gpsdemo.util;

import android.app.AlertDialog;

import android.content.Context;

import android.os.AsyncTask;

import android.util.Log;

import android.widget.TextView;

public class GetLocation {

AlertDialog dialog;

TextView textView;

Context context;

public GetLocation(AlertDialog dialog, TextView textView, Context context) {

this.dialog = dialog;

this.textView = textView;

this.context = context;

}

public void DisplayLocation() {

new AsyncTask() {

@Override

protected String doInBackground=\'#\'"

LMLocation location = null;

try {

location = new GPSLocation().getGPSInfo(context);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if (location == null)

return null;

Log.d("debug", location.toString());

return location.toString();

}

@Override

protected void onPreExecute() {

dialog.show();

super.onPreExecute();

}

@Override

protected void onPostExecute(String result) {

if (result == null) {

textView.setText("定位失败了...");

} else {

textView.setText(result);

}

dialog.dismiss();

super.onPostExecute(result);

}

}.execute();

}

}

2.

[java] view
plaincopy

package com.example.gpsdemo.util;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import org.apache.http.HttpEntity;

import org.apache.http.HttpHost;

import org.apache.http.HttpResponse;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.conn.params.ConnRouteParams;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.params.HttpConnectionParams;

import org.json.JSONArray;

import org.json.JSONObject;

import android.content.Context;

import android.database.Cursor;

import android.net.ConnectivityManager;

import android.net.NetworkInfo.State;

import android.net.Uri;

import android.net.wifi.WifiManager;

import android.telephony.TelephonyManager;

import android.telephony.gsm.GsmCellLocation;

import android.util.Log;

/**

* ******************************************

* 描述::GPS信息获取

* @version 2.0

********************************************

*/

public class GPSLocation {

private static int postType = -1;

public static final int DO_3G = 0;

public static final int DO_WIFI = 1;

public static final int NO_CONNECTION = 2;

/**

* 网络方式检查

*/

private static int netCheck(Context context) {

ConnectivityManager conMan = (ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE);

State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)

.getState();

State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI)

.getState();

if (wifi.equals(State.CONNECTED)) {

return DO_WIFI;

} else if (mobile.equals(State.CONNECTED)) {

return DO_3G;

} else {

return NO_CONNECTION;

}

}

/**

* 获取WifiManager获取信息

*/

private static JSONObject getInfoByWifiManager(Context context)

throws Exception {

JSONObject holder = new JSONObject();

holder.put("version", "1.1.0");

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

holder.put("address_language", "zh_CN");

holder.put("request_address", true);

WifiManager wifiManager = (WifiManager) context

.getSystemService(Context.WIFI_SERVICE);

if (wifiManager.getConnectionInfo().getBSSID() == null) {

throw new RuntimeException("bssid is null");

}

JSONArray array = new JSONArray();

JSONObject data = new JSONObject();

data.put("mac_address", wifiManager.getConnectionInfo().getBSSID());

data.put("signal_strength", 8);

data.put("age", 0);

array.put(data);

holder.put("wifi_towers", array);

return holder;

}

/**

* 获取TelephoneManager获取信息

*/

private static JSONObject getInfoByTelephoneManager(Context context)

throws Exception {

JSONObject holder = new JSONObject();

holder.put("version", "1.1.0");

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

holder.put("address_language", "zh_CN");

holder.put("request_address", true);

TelephonyManager tm = (TelephonyManager) context

.getSystemService(Context.TELEPHONY_SERVICE);

GsmCellLocation gcl = (GsmCellLocation) tm.getCellLocation();

int cid = gcl.getCid();

int lac = gcl.getLac();

int mcc = Integer.valueOf(tm.getNetworkOperator().substring(0, 3));

int mnc = Integer.valueOf(tm.getNetworkOperator().substring(3, 5));

JSONArray array = new JSONArray();

JSONObject data = new JSONObject();

data.put("cell_id", cid);

data.put("location_area_code", lac);

data.put("mobile_country_code", mcc);

data.put("mobile_network_code", mnc);

array.put(data);

holder.put("cell_towers", array);

return holder;

}

/**

* 通过wifi获取GPS信息

*/

private static HttpResponse connectionForGPS(Context context)

throws Exception {

HttpResponse httpResponse = null;

postType = netCheck(context);

if (postType == NO_CONNECTION) {

return null;

} else {

if (postType == DO_WIFI) {

if ((httpResponse = doOrdinary(context,

getInfoByWifiManager(context))) != null) {

return httpResponse;

} else if ((httpResponse = doAPN(context,

getInfoByWifiManager(context))) != null) {

return httpResponse;

} else if ((httpResponse = doOrdinary(context,

getInfoByTelephoneManager(context))) != null) {

return httpResponse;

} else if ((httpResponse = doAPN(context,

getInfoByTelephoneManager(context))) != null) {

return httpResponse;

}

}

if (postType == DO_3G) {

if ((httpResponse = doOrdinary(context,

getInfoByTelephoneManager(context))) != null) {

return httpResponse;

} else if ((httpResponse = doAPN(context,

getInfoByTelephoneManager(context))) != null) {

return httpResponse;

}

}

return null;

}

}

/**

* 通过普通方式定位

*/

private static HttpResponse doOrdinary(Context context, JSONObject holder) {

HttpResponse response = null;

try {

HttpClient httpClient = new DefaultHttpClient();

HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),

20 * 1000);

HttpConnectionParams

.setSoTimeout(httpClient.getParams(), 20 * 1000);

HttpPost post = new HttpPost("http://74.125.71.147/loc/json");

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

post.setEntity(se);

response = httpClient.execute(post);

} catch (Exception e) {

e.printStackTrace();

return null;

}

return response;

}

/**

* 通过基站定位

*/

private static HttpResponse doAPN(Context context, JSONObject holder) {

HttpResponse response = null;

try {

HttpClient httpClient = new DefaultHttpClient();

HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),

20 * 1000);

HttpConnectionParams

.setSoTimeout(httpClient.getParams(), 20 * 1000);

HttpPost post = new HttpPost("http://74.125.71.147/loc/json");

// 设置代理

Uri uri = Uri.parse("content://telephony/carriers/preferapn"); // 获取当前正在使用的APN接入点

Cursor mCursor = context.getContentResolver().query(uri, null,

null, null, null);

if (mCursor != null) {

if (mCursor.moveToFirst()) {

String proxyStr = mCursor.getString(mCursor

.getColumnIndex("proxy"));

if (proxyStr != null && proxyStr.trim().length() > 0) {

HttpHost proxy = new HttpHost(proxyStr, 80);

httpClient.getParams().setParameter(

ConnRouteParams.DEFAULT_PROXY, proxy);

}

}

}

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

post.setEntity(se);

response = httpClient.execute(post);

} catch (Exception e) {

e.printStackTrace();

return null;

}

return response;

}

/**

* GPS信息解析

*/

public static LMLocation getGPSInfo(Context context) throws Exception {

HttpResponse response = connectionForGPS(context);

if (response == null) {

Log.d("GPSLocation", "response == null");

return null;

}

LMLocation location = null;

if (response.getStatusLine().getStatusCode() == 200) {

location = new LMLocation();

HttpEntity entity = response.getEntity();

BufferedReader br;

try {

br = new BufferedReader(new InputStreamReader(

entity.getContent()));

StringBuffer sb = new StringBuffer();

String result = br.readLine();

while (result != null) {

sb.append(result);

result = br.readLine();

}

JSONObject json = new JSONObject(sb.toString());

JSONObject lca = json.getJSONObject("location");

location.setAccess_token(json.getString("access_token"));

if (lca != null) {

if (lca.has("accuracy"))

location.setAccuracy(lca.getString("accuracy"));

if (lca.has("longitude"))

location.setLatitude(lca.getDouble("longitude"));

if (lca.has("latitude"))

location.setLongitude(lca.getDouble("latitude"));

if (lca.has("address")) {

JSONObject address = lca.getJSONObject("address");

if (address != null) {

if (address.has("region"))

location.setRegion(address.getString("region"));

if (address.has("street_number"))

location.setStreet_number(address

.getString("street_number"));

if (address.has("country_code"))

location.setCountry_code(address

.getString("country_code"));

if (address.has("street"))

location.setStreet(address.getString("street"));

if (address.has("city"))

location.setCity(address.getString("city"));

if (address.has("country"))

location.setCountry(address

.getString("country"));

}

}

}

} catch (Exception e) {

e.printStackTrace();

location = null;

}

}

return location;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: