`

android 基于基站,apn,gps,wifi,network 根据不同手机sim卡获取经纬度

阅读更多

一:新建MyLocation类,本类主要管理使用各种获取经纬度的方法,由于代码比较多就不一一解释直接上代码:

 

Java代码  收藏代码
  1. package com.android.location2;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.io.UnsupportedEncodingException;  
  7. import java.util.ArrayList;  
  8. import org.apache.http.HttpEntity;  
  9. import org.apache.http.HttpResponse;  
  10. import org.apache.http.client.ClientProtocolException;  
  11. import org.apache.http.client.methods.HttpPost;  
  12. import org.apache.http.entity.StringEntity;  
  13. import org.apache.http.impl.client.DefaultHttpClient;  
  14. import org.json.JSONArray;  
  15. import org.json.JSONException;  
  16. import org.json.JSONObject;  
  17. import android.app.Activity;  
  18. import android.content.Context;  
  19. import android.location.Location;  
  20. import android.location.LocationManager;  
  21. import android.os.AsyncTask;  
  22. import android.telephony.TelephonyManager;  
  23. import android.telephony.cdma.CdmaCellLocation;  
  24. import android.widget.Toast;  
  25. import com.android.gps.AddressTask;  
  26. import com.android.gps.CellIDInfo;  
  27. import com.android.gps.GpsTask;  
  28. import com.android.gps.GpsTask.GpsData;  
  29. import com.android.gps.GpsTaskCallBack;  
  30. import com.android.gps.IAddressTask;  
  31. import com.android.gps.IAddressTask.MLocation;  
  32.   
  33. public class MyLocation {  
  34.   
  35.     private LocationCallBack callBack;  
  36.     private boolean status = false;  
  37.   
  38.     public MyLocation(LocationCallBack callBack, Activity cxt) {  
  39.         this.callBack = callBack;  
  40.         if (getMobileType(cxt) == 3) {  
  41.   
  42.             TelephonyManager tm = (TelephonyManager) cxt  
  43.                     .getSystemService(Context.TELEPHONY_SERVICE);  
  44.             CdmaCellLocation location = (CdmaCellLocation) tm.getCellLocation();  
  45.             if (location == null)  
  46.                 return;  
  47.             int sid = location.getSystemId();// 系统标识 mobileNetworkCode  
  48.             int bid = location.getBaseStationId();// 基站小区号 cellId  
  49.             int nid = location.getNetworkId();// 网络标识 locationAreaCode  
  50.             ArrayList<CellIDInfo> CellID = new ArrayList<CellIDInfo>();  
  51.             CellIDInfo info = new CellIDInfo();  
  52.             info.cellId = bid;  
  53.             info.locationAreaCode = nid;  
  54.             info.mobileNetworkCode = String.valueOf(sid);  
  55.             info.mobileCountryCode = tm.getNetworkOperator().substring(03);  
  56.             info.mobileCountryCode = tm.getNetworkOperator().substring(35);  
  57.             info.radioType = "cdma";  
  58.             CellID.add(info);  
  59.             Location mLocation = callGear(CellID);  
  60.             if (mLocation != null) {  
  61.                 callBack.onCurrentLocation(mLocation.getLatitude(),  
  62.                         mLocation.getLongitude());  
  63.             }  
  64.         } else {  
  65.             Location mLocation = getLocation(cxt);  
  66.             if (mLocation != null) {  
  67.                 callBack.onCurrentLocation(mLocation.getLatitude(),  
  68.                         mLocation.getLongitude());  
  69.             } else {  
  70.                 getMeLocation(cxt);  
  71.             }  
  72.         }  
  73.     }  
  74.   
  75.     public interface LocationCallBack {  
  76.         void onCurrentLocation(double latitude, double longitude);  
  77.   
  78.     }  
  79.   
  80.     // 调用google gears的方法,该方法调用gears来获取经纬度  
  81.     private Location callGear(ArrayList<CellIDInfo> cellID) {  
  82.         if (cellID == null)  
  83.             return null;  
  84.   
  85.         DefaultHttpClient client = new DefaultHttpClient();  
  86.         HttpPost post = new HttpPost("http://www.google.com/loc/json");  
  87.         JSONObject holder = new JSONObject();  
  88.   
  89.         try {  
  90.             holder.put("version""1.1.0");  
  91.             holder.put("host""maps.google.com");  
  92.             holder.put("home_mobile_country_code",  
  93.                     cellID.get(0).mobileCountryCode);  
  94.             holder.put("home_mobile_network_code",  
  95.                     cellID.get(0).mobileNetworkCode);  
  96.             holder.put("radio_type", cellID.get(0).radioType);  
  97.             holder.put("request_address"true);  
  98.             if ("460".equals(cellID.get(0).mobileCountryCode))  
  99.                 holder.put("address_language""zh_CN");  
  100.             else  
  101.                 holder.put("address_language""en_US");  
  102.   
  103.             JSONObject data, current_data;  
  104.   
  105.             JSONArray array = new JSONArray();  
  106.   
  107.             current_data = new JSONObject();  
  108.             current_data.put("cell_id", cellID.get(0).cellId);  
  109.             current_data.put("location_area_code",  
  110.                     cellID.get(0).locationAreaCode);  
  111.             current_data.put("mobile_country_code",  
  112.                     cellID.get(0).mobileCountryCode);  
  113.             current_data.put("mobile_network_code",  
  114.                     cellID.get(0).mobileNetworkCode);  
  115.             current_data.put("age"0);  
  116.             current_data.put("signal_strength", -60);  
  117.             current_data.put("timing_advance"5555);  
  118.             array.put(current_data);  
  119.   
  120.             holder.put("cell_towers", array);  
  121.   
  122.             StringEntity se = new StringEntity(holder.toString());  
  123.             post.setEntity(se);  
  124.             HttpResponse resp = client.execute(post);  
  125.   
  126.             HttpEntity entity = resp.getEntity();  
  127.   
  128.             BufferedReader br = new BufferedReader(new InputStreamReader(  
  129.                     entity.getContent()));  
  130.             StringBuffer sb = new StringBuffer();  
  131.             String result = br.readLine();  
  132.             while (result != null) {  
  133.                 sb.append(result);  
  134.                 result = br.readLine();  
  135.             }  
  136.   
  137.             data = new JSONObject(sb.toString());  
  138.             data = (JSONObject) data.get("location");  
  139.   
  140.             Location loc = new Location(LocationManager.NETWORK_PROVIDER);  
  141.             loc.setLatitude((Double) data.get("latitude"));  
  142.             loc.setLongitude((Double) data.get("longitude"));  
  143.             loc.setAccuracy(Float.parseFloat(data.get("accuracy").toString()));  
  144.             loc.setTime(System.currentTimeMillis());// AppUtil.getUTCTime());  
  145.             return loc;  
  146.         } catch (JSONException e) {  
  147.             e.printStackTrace();  
  148.             return null;  
  149.         } catch (UnsupportedEncodingException e) {  
  150.             e.printStackTrace();  
  151.         } catch (ClientProtocolException e) {  
  152.             e.printStackTrace();  
  153.         } catch (IOException e) {  
  154.             e.printStackTrace();  
  155.         }  
  156.         return null;  
  157.     }  
  158.   
  159.     @SuppressWarnings("unchecked")  
  160.     public void getMeLocation(final Activity cxt) {  
  161.         do_apn(cxt);  
  162.         if (status) {  
  163.             status = false;  
  164.             do_wifi(cxt);  
  165.         } else if (status) {  
  166.             status = false;  
  167.             GpsTask gpstask = new GpsTask(cxt, new GpsTaskCallBack() {  
  168.   
  169.                 public void gpsConnectedTimeOut() {  
  170.                     Toast.makeText(cxt, "Error", Toast.LENGTH_LONG).show();  
  171.                 }  
  172.   
  173.                 public void gpsConnected(GpsData gpsdata) {  
  174.                     do_gps(gpsdata, cxt);  
  175.                 }  
  176.   
  177.             }, 3000);  
  178.             gpstask.execute();  
  179.         }  
  180.   
  181.     }  
  182.   
  183.     private void do_apn(final Activity cxt) {  
  184.   
  185.         new AsyncTask<Void, Void, MLocation>() {  
  186.   
  187.             protected MLocation doInBackground(Void... params) {  
  188.                 MLocation location = null;  
  189.                 try {  
  190.                     location = new AddressTask(cxt, IAddressTask.DO_APN)  
  191.                             .doApnPost();  
  192.                 } catch (Exception e) {  
  193.                     e.printStackTrace();  
  194.                 }  
  195.                 if (location != null)  
  196.                     return location;  
  197.                 else  
  198.                     return null;  
  199.             }  
  200.   
  201.             protected void onPreExecute() {  
  202.                 super.onPreExecute();  
  203.             }  
  204.   
  205.             protected void onPostExecute(MLocation result) {  
  206.                 if (result != null) {  
  207.                     setData(result);  
  208.                     status = true;  
  209.                 } else {  
  210.                     status = false;  
  211.                 }  
  212.                 super.onPostExecute(result);  
  213.             }  
  214.   
  215.         }.execute();  
  216.   
  217.     }  
  218.   
  219.     private void do_gps(final GpsData gpsdata, final Activity cxt) {  
  220.         new AsyncTask<Void, Void, MLocation>() {  
  221.   
  222.             protected MLocation doInBackground(Void... params) {  
  223.                 MLocation location = null;  
  224.                 try {  
  225.                     location = new AddressTask(cxt, IAddressTask.DO_GPS)  
  226.                             .doGpsPost(gpsdata.getLatitude(),  
  227.                                     gpsdata.getLongitude());  
  228.                 } catch (Exception e) {  
  229.                     e.printStackTrace();  
  230.                 }  
  231.                 return location;  
  232.             }  
  233.   
  234.             protected void onPreExecute() {  
  235.                 super.onPreExecute();  
  236.             }  
  237.   
  238.             protected void onPostExecute(MLocation result) {  
  239.                 // gps_tip.setText(result);  
  240.                 if (result != null) {  
  241.                     setData(result);  
  242.                     status = true;  
  243.                 } else {  
  244.                     status = false;  
  245.                 }  
  246.                 super.onPostExecute(result);  
  247.             }  
  248.   
  249.         }.execute();  
  250.   
  251.     }  
  252.   
  253.     private void do_wifi(final Activity cxt) {  
  254.         new AsyncTask<Void, Void, MLocation>() {  
  255.   
  256.             protected MLocation doInBackground(Void... params) {  
  257.                 MLocation location = null;  
  258.                 try {  
  259.                     location = new AddressTask(cxt, IAddressTask.DO_WIFI)  
  260.                             .doWifiPost();  
  261.                 } catch (Exception e) {  
  262.                     e.printStackTrace();  
  263.                 }  
  264.                 if (location == null) {  
  265.                     return null;  
  266.                 } else  
  267.                     return location;  
  268.             }  
  269.   
  270.             protected void onPreExecute() {  
  271.                 super.onPreExecute();  
  272.             }  
  273.   
  274.             protected void onPostExecute(MLocation result) {  
  275.                 if (result != null) {  
  276.                     setData(result);  
  277.                     status = true;  
  278.                 } else {  
  279.                     status = false;  
  280.                 }  
  281.                 super.onPostExecute(result);  
  282.             }  
  283.   
  284.         }.execute();  
  285.   
  286.     }  
  287.   
  288.     private void setData(MLocation result) {  
  289.   
  290.         callBack.onCurrentLocation(result.getLatitude(), result.getLongitude());  
  291.     }  
  292.   
  293.     // Get the Location by GPS or WIFI  
  294.     public Location getLocation(Context context) {  
  295.         LocationManager locMan = (LocationManager) context  
  296.                 .getSystemService(Context.LOCATION_SERVICE);  
  297.         Location location = locMan  
  298.                 .getLastKnownLocation(LocationManager.GPS_PROVIDER);  
  299.         if (location == null) {  
  300.             location = locMan  
  301.                     .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);  
  302.         }  
  303.         return location;  
  304.     }  
  305.   
  306.     private int getMobileType(Context context) {  
  307.         TelephonyManager iPhoneManager = (TelephonyManager) context  
  308.                 .getSystemService(Context.TELEPHONY_SERVICE);  
  309.         String iNumeric = iPhoneManager.getSimOperator();  
  310.         if (iNumeric.length() > 0) {  
  311.             if (iNumeric.equals("46000") || iNumeric.equals("46002")) {  
  312.                 return 1;  
  313.             } else if (iNumeric.equals("46001")) {  
  314.                 return 2;  
  315.             } else if (iNumeric.equals("46003")) {  
  316.                 return 3;  
  317.             }  
  318.   
  319.         }  
  320.         return 1;  
  321.   
  322.     }  
  323. }  
 

 

二:在MainActivity 中实现LocationCallBack接口,如下:

 

Java代码  收藏代码
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.widget.TextView;  
  4. import com.android.location2.MyLocation.LocationCallBack;  
  5. public class MainActivity extends Activity implements LocationCallBack{  
  6. private TextView desText;  
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_main);  
  11.         desText = (TextView) this.findViewById(R.id.text);  
  12.         new MyLocation(MainActivity.thisthis);  
  13. }  
  14. //回调方法  
  15. public void onCurrentLocation(double latitude, double longitude) {  
  16. desText.setText("当前经度:" + longitude + "\n当前纬度:"+ latitude);  
  17. }  
  18.       
  19. }  
 

 

三:获取经纬度使用的辅助类,这里补贴代码后面直接上传源码:


四:效果如下图:


 

分享到:
评论

相关推荐

    Android开发之系统信息【5】——获取APN列表

    Android 获取 APN 列表的系统信息 Android 系统中对于 APN 的网络 API 没有公开,但是我们可以通过阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭 APN。 APN(Access Point ...

    android手机APN设置

    Android 手机 APN 设置 APN(Access Point Name)是移动网络中的一个重要概念,它是指移动网络中的一个访问点名称,用于标识移动网络中的一个访问点。Android 手机中的 APN 设置是指在 Android 手机中设置移动网络...

    android 全面解析apn

    数据库中的 APN 信息将被用于匹配 SIM 卡的 MCC 和 MNC,以确定使用哪个 APN。 APN 的实现机制: APN 的实现机制主要包括两个部分:APN 的创建和 APN 的加载。APN 的创建是指将 APN 信息从 XML 文件加载到数据库中...

    android_gps_wifi_基站_定位集合文档

    在Android平台上,GPS(全球定位系统)和其他辅助定位技术如WiFi和基站定位是实现设备位置服务的关键组件。本文档集合了这些技术的整合方法,帮助开发者实现更精确和高效的定位功能。 首先,我们来深入理解GPS定位...

    [Mark安卓教程]Android手机修改APN不保存解决办法.pdf

    ### Android手机修改APN不保存解决办法 #### 一、APN基础知识介绍 APN(Access Point Name,接入点名称)是移动设备访问互联网时必须配置的重要参数之一。它不仅决定了用户通过何种接入方式访问互联网,而且还关联...

    android判断网络状态、网络运营商、网络类型

    在Android开发中,掌握如何判断网络状态、获取网络运营商以及识别网络类型是非常关键的技能,这对于构建具有网络功能的应用程序至关重要。以下将详细介绍这些知识点。 首先,**判断网络状态**是确保应用程序能够...

    android中的APN开发

    在Android系统中,APN(Access Point Name)是网络连接的关键配置,用于定义设备如何接入互联网,特别是通过移动数据。APN包含了网络提供商的名称、数据类型、用户名、密码等信息,这些信息决定了手机如何通过运营商...

    获取和修改手机当前APN

    "获取和修改手机当前APN" 在 Android 系统中,APN(Access Point Name)是手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络。APN 保存在数据库中,数据库绝对路径为 `/data/data/...

    Android基于APN获取手机号的方法

    本文实例讲述了Android基于APN获取手机号的方法。分享给大家供大家参考。具体如下: 之前很多人说无法完全获取手机号,是因为现在有的卡不能获取,有的卡能获取,现在我们可以换一种思路来考虑问题,就是用APN的方式...

    Android端APN实现module

    在Android系统中,APN(Access Point Name)是用于设置移动数据网络连接的关键参数,它定义了设备如何连接到互联网,通常包括网络运营商、数据服务类型等信息。本模块主要探讨的是如何在Android应用程序中通过代码来...

    android 设置apn

    大多数Android设备在插入SIM卡后会自动从运营商处获取正确的APN设置。这通常在设备的“网络设置”或“移动网络”菜单下完成。然而,有时自动设置可能不完整或不准确,此时就需要手动干预。 **手动设置APN** 1. 进入...

    对sim卡的基本操作

    - 不同运营商的网络设置可能会有所不同,有时更换SIM卡后需要手动设置APN(Access Point Name),以确保数据服务正常工作。 - APN设置通常包括网络类型、用户名、密码等,这些信息可咨询运营商获取。 7. **SIM卡...

    (安卓)Android获取本机手机号及服务运营商

    在Android开发中,有时我们需要获取用户的手机硬件信息,如手机号码和服务运营商,这些信息对于实现特定功能,如发送短信验证、个性化服务等至关重要。本文将详细介绍如何在Android应用中获取本机手机号及服务运营商...

    mtk modem和sim卡遇到的问题与解决方法.zip

    SIM卡(Subscriber Identity Module)是移动通信设备中的重要组件,存储用户的网络身份信息,使得用户可以在不同设备上享受相同的服务。 标题"mtk modem和sim卡遇到的问题与解决方法.zip"表明这个压缩包文件包含了...

    Android APN开发流程分析.doc

    Android APN 开发流程分析 Android APN 开发流程分析是指 Android 操作系统中数据连接的实现过程,主要涉及到数据连接的建立、维护和管理。以下是 Android APN 开发流程分析的关键知识点: 1. 数据连接流程分析 ...

    android APN 设置

    在Android系统中,APN(Access Point Name)是设置数据连接的关键配置,它定义了设备如何连接到互联网或移动数据网络。APN包含了运营商提供的网络接入点信息,比如网络类型(2G、3G、4G、5G)、用户名、密码、服务器...

    android APN开发流程

    ### Android APN开发流程详解 #### 一、数据连接机制概览 Android设备的数据连接机制主要依赖于PPP(Point-to-Point Protocol)协议,这是一套用于在点对点链路上进行数据传输的标准协议,适用于拨号电话、ISDN、X....

    华为4Gwifi路由器泰国三大运营商上网卡APN设置

    本文将详细介绍如何设置华为4G WiFi路由器与泰国三大运营商(Happy卡、AIS卡、True Move卡)的APN参数,以便于在泰国旅游期间实现稳定快速的网络共享。 #### 二、准备工作 1. **华为4G WiFi路由器**:确保设备电量...

    基于android开发的GPS定位

    GPS定位 gps_tip = (TextView) findViewById(R.id.gps_tip); findViewById(R.id.do_gps).setOnClickListener(GpsActivity.this); findViewById(R.id.do_apn).setOnClickListener(GpsActivity.this); ...

Global site tag (gtag.js) - Google Analytics