一:新建MyLocation类,本类主要管理使用各种获取经纬度的方法,由于代码比较多就不一一解释直接上代码:
- package com.android.location2;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.UnsupportedEncodingException;
- import java.util.ArrayList;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.client.ClientProtocolException;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.entity.StringEntity;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;
- import android.app.Activity;
- import android.content.Context;
- import android.location.Location;
- import android.location.LocationManager;
- import android.os.AsyncTask;
- import android.telephony.TelephonyManager;
- import android.telephony.cdma.CdmaCellLocation;
- import android.widget.Toast;
- import com.android.gps.AddressTask;
- import com.android.gps.CellIDInfo;
- import com.android.gps.GpsTask;
- import com.android.gps.GpsTask.GpsData;
- import com.android.gps.GpsTaskCallBack;
- import com.android.gps.IAddressTask;
- import com.android.gps.IAddressTask.MLocation;
- public class MyLocation {
- private LocationCallBack callBack;
- private boolean status = false;
- public MyLocation(LocationCallBack callBack, Activity cxt) {
- this.callBack = callBack;
- if (getMobileType(cxt) == 3) {
- TelephonyManager tm = (TelephonyManager) cxt
- .getSystemService(Context.TELEPHONY_SERVICE);
- CdmaCellLocation location = (CdmaCellLocation) tm.getCellLocation();
- if (location == null)
- return;
- int sid = location.getSystemId();// 系统标识 mobileNetworkCode
- int bid = location.getBaseStationId();// 基站小区号 cellId
- int nid = location.getNetworkId();// 网络标识 locationAreaCode
- ArrayList<CellIDInfo> CellID = new ArrayList<CellIDInfo>();
- CellIDInfo info = new CellIDInfo();
- info.cellId = bid;
- info.locationAreaCode = nid;
- info.mobileNetworkCode = String.valueOf(sid);
- info.mobileCountryCode = tm.getNetworkOperator().substring(0, 3);
- info.mobileCountryCode = tm.getNetworkOperator().substring(3, 5);
- info.radioType = "cdma";
- CellID.add(info);
- Location mLocation = callGear(CellID);
- if (mLocation != null) {
- callBack.onCurrentLocation(mLocation.getLatitude(),
- mLocation.getLongitude());
- }
- } else {
- Location mLocation = getLocation(cxt);
- if (mLocation != null) {
- callBack.onCurrentLocation(mLocation.getLatitude(),
- mLocation.getLongitude());
- } else {
- getMeLocation(cxt);
- }
- }
- }
- public interface LocationCallBack {
- void onCurrentLocation(double latitude, double longitude);
- }
- // 调用google gears的方法,该方法调用gears来获取经纬度
- private Location callGear(ArrayList<CellIDInfo> cellID) {
- if (cellID == null)
- return null;
- DefaultHttpClient client = new DefaultHttpClient();
- HttpPost post = new HttpPost("http://www.google.com/loc/json");
- JSONObject holder = new JSONObject();
- try {
- holder.put("version", "1.1.0");
- holder.put("host", "maps.google.com");
- holder.put("home_mobile_country_code",
- cellID.get(0).mobileCountryCode);
- holder.put("home_mobile_network_code",
- cellID.get(0).mobileNetworkCode);
- holder.put("radio_type", cellID.get(0).radioType);
- holder.put("request_address", true);
- if ("460".equals(cellID.get(0).mobileCountryCode))
- holder.put("address_language", "zh_CN");
- else
- holder.put("address_language", "en_US");
- JSONObject data, current_data;
- JSONArray array = new JSONArray();
- current_data = new JSONObject();
- current_data.put("cell_id", cellID.get(0).cellId);
- current_data.put("location_area_code",
- cellID.get(0).locationAreaCode);
- current_data.put("mobile_country_code",
- cellID.get(0).mobileCountryCode);
- current_data.put("mobile_network_code",
- cellID.get(0).mobileNetworkCode);
- current_data.put("age", 0);
- current_data.put("signal_strength", -60);
- current_data.put("timing_advance", 5555);
- array.put(current_data);
- holder.put("cell_towers", array);
- StringEntity se = new StringEntity(holder.toString());
- post.setEntity(se);
- HttpResponse resp = client.execute(post);
- HttpEntity entity = resp.getEntity();
- BufferedReader br = new BufferedReader(new InputStreamReader(
- entity.getContent()));
- StringBuffer sb = new StringBuffer();
- String result = br.readLine();
- while (result != null) {
- sb.append(result);
- result = br.readLine();
- }
- data = new JSONObject(sb.toString());
- data = (JSONObject) data.get("location");
- Location loc = new 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());// AppUtil.getUTCTime());
- return loc;
- } catch (JSONException e) {
- e.printStackTrace();
- return null;
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- @SuppressWarnings("unchecked")
- public void getMeLocation(final Activity cxt) {
- do_apn(cxt);
- if (status) {
- status = false;
- do_wifi(cxt);
- } else if (status) {
- status = false;
- GpsTask gpstask = new GpsTask(cxt, new GpsTaskCallBack() {
- public void gpsConnectedTimeOut() {
- Toast.makeText(cxt, "Error", Toast.LENGTH_LONG).show();
- }
- public void gpsConnected(GpsData gpsdata) {
- do_gps(gpsdata, cxt);
- }
- }, 3000);
- gpstask.execute();
- }
- }
- private void do_apn(final Activity cxt) {
- new AsyncTask<Void, Void, MLocation>() {
- protected MLocation doInBackground(Void... params) {
- MLocation location = null;
- try {
- location = new AddressTask(cxt, IAddressTask.DO_APN)
- .doApnPost();
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (location != null)
- return location;
- else
- return null;
- }
- protected void onPreExecute() {
- super.onPreExecute();
- }
- protected void onPostExecute(MLocation result) {
- if (result != null) {
- setData(result);
- status = true;
- } else {
- status = false;
- }
- super.onPostExecute(result);
- }
- }.execute();
- }
- private void do_gps(final GpsData gpsdata, final Activity cxt) {
- new AsyncTask<Void, Void, MLocation>() {
- protected MLocation doInBackground(Void... params) {
- MLocation location = null;
- try {
- location = new AddressTask(cxt, IAddressTask.DO_GPS)
- .doGpsPost(gpsdata.getLatitude(),
- gpsdata.getLongitude());
- } catch (Exception e) {
- e.printStackTrace();
- }
- return location;
- }
- protected void onPreExecute() {
- super.onPreExecute();
- }
- protected void onPostExecute(MLocation result) {
- // gps_tip.setText(result);
- if (result != null) {
- setData(result);
- status = true;
- } else {
- status = false;
- }
- super.onPostExecute(result);
- }
- }.execute();
- }
- private void do_wifi(final Activity cxt) {
- new AsyncTask<Void, Void, MLocation>() {
- protected MLocation doInBackground(Void... params) {
- MLocation location = null;
- try {
- location = new AddressTask(cxt, IAddressTask.DO_WIFI)
- .doWifiPost();
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (location == null) {
- return null;
- } else
- return location;
- }
- protected void onPreExecute() {
- super.onPreExecute();
- }
- protected void onPostExecute(MLocation result) {
- if (result != null) {
- setData(result);
- status = true;
- } else {
- status = false;
- }
- super.onPostExecute(result);
- }
- }.execute();
- }
- private void setData(MLocation result) {
- callBack.onCurrentLocation(result.getLatitude(), result.getLongitude());
- }
- // Get the Location by GPS or WIFI
- public Location getLocation(Context context) {
- LocationManager locMan = (LocationManager) context
- .getSystemService(Context.LOCATION_SERVICE);
- Location location = locMan
- .getLastKnownLocation(LocationManager.GPS_PROVIDER);
- if (location == null) {
- location = locMan
- .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
- }
- return location;
- }
- private int getMobileType(Context context) {
- TelephonyManager iPhoneManager = (TelephonyManager) context
- .getSystemService(Context.TELEPHONY_SERVICE);
- String iNumeric = iPhoneManager.getSimOperator();
- if (iNumeric.length() > 0) {
- if (iNumeric.equals("46000") || iNumeric.equals("46002")) {
- return 1;
- } else if (iNumeric.equals("46001")) {
- return 2;
- } else if (iNumeric.equals("46003")) {
- return 3;
- }
- }
- return 1;
- }
- }
二:在MainActivity 中实现LocationCallBack接口,如下:
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- import com.android.location2.MyLocation.LocationCallBack;
- public class MainActivity extends Activity implements LocationCallBack{
- private TextView desText;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- desText = (TextView) this.findViewById(R.id.text);
- new MyLocation(MainActivity.this, this);
- }
- //回调方法
- public void onCurrentLocation(double latitude, double longitude) {
- desText.setText("当前经度:" + longitude + "\n当前纬度:"+ latitude);
- }
- }
三:获取经纬度使用的辅助类,这里补贴代码后面直接上传源码:
四:效果如下图:
相关推荐
- `AT+ICCID`:获取SIM卡的ICCID号,即SIM卡的唯一标识。 5. **网络切换与基站信息** - `AT+MCELL`:获取当前连接的基站信息。 - `AT+GTBCCH`:用于解锁或切换小区,`0`为解锁,`2`加特定参数为切换。 - `AT+...
它们需要支持GPRS功能,具备SIM卡插槽,能够接入GSM网络并进行数据通信。 2. **基站子系统(Base Station Subsystem, BSS)**:由基站控制器(BSC)和基站收发信台(BTS)组成,负责控制无线链路,处理与移动设备的...
- **MS**(Mobile Station):移动站,包括手机终端和SIM卡。 - **BSS**(Base Station Subsystem):基站子系统,包括BTS(基站收发台)和BSC(基站控制器)。 - **SGSN**(Serving GPRS Support Node):服务GPRS...