Heim > Java > javaLernprogramm > Hauptteil

Wie Android den Dienst implementiert, um den aktuellen Standort zu ermitteln (GPS + Basisstation)

高洛峰
Freigeben: 2017-01-07 15:06:30
Original
2803 Leute haben es durchsucht

Das Beispiel in diesem Artikel beschreibt, wie Android den Dienst implementiert, um den aktuellen Standort (GPS + Basisstation) zu ermitteln. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Anforderungsdetails:

1 Der Positionierungsvorgang (GPS + Basisstation) wird im Dienst
2) durchgeführt Die Ergebnisse werden in Echtzeit auf der Schnittstelle angezeigt (Längen- und Breitengrad anfordern)

Technischer Support:

1), Breiten- und Längengrad ermitteln
Breiten- und Längengrad über GPS + Basisstation ermitteln , rufen Sie es zuerst über GPS ab. Wenn es leer ist, verwenden Sie die Basisstation, um es abzurufen - >GPS+-Basisstation (die Basisstation unterstützt China Unicom, China Telecom und China Mobile).
2) Echtzeit-Erfassung von Breiten- und Längengrad
Um den Breiten- und Längengrad in Echtzeit zu erhalten, ist es notwendig, den Dienst zu starten, um den Breiten- und Längengrad im Hintergrund zu ermitteln, und dann den Breitengrad zu senden und Längengraddaten über Broadcast und registrieren Sie die Broadcasts bei Bedarf (z. B. Registrieren der Broadcasts in der Aktivität, die in der Benutzeroberfläche angezeigt wird) –> Einbeziehen von Wissenspunkten wie Service+BroadcastReceiver+Activity+Thread.

Hinweis: Dieser Artikel konzentriert sich auf die Praxis. Wenn Sie nichts verstehen, konsolidieren Sie zunächst die Wissenspunkte. Sie können die vorherigen verwandten Artikel lesen.

1. CellInfo-Entitätsklasse –> 🎜>3, GpsService-Dienstklasse

package com.ljq.activity;
/**
 * 基站信息
 * 
 * @author jiqinlin
 * 
 */
public class CellInfo {
 /** 基站id,用来找到基站的位置 */
 private int cellId;
 /** 移动国家码,共3位,中国为460,即imsi前3位 */
 private String mobileCountryCode="460";
 /** 移动网络码,共2位,在中国,移动的代码为00和02,联通的代码为01,电信的代码为03,即imsi第4~5位 */
 private String mobileNetworkCode="0";
 /** 地区区域码 */
 private int locationAreaCode;
 /** 信号类型[选 gsm|cdma|wcdma] */
 private String radioType="";
 public CellInfo() {
 }
 public int getCellId() {
 return cellId;
 }
 public void setCellId(int cellId) {
 this.cellId = cellId;
 }
 public String getMobileCountryCode() {
 return mobileCountryCode;
 }
 public void setMobileCountryCode(String mobileCountryCode) {
 this.mobileCountryCode = mobileCountryCode;
 }
 public String getMobileNetworkCode() {
 return mobileNetworkCode;
 }
 public void setMobileNetworkCode(String mobileNetworkCode) {
 this.mobileNetworkCode = mobileNetworkCode;
 }
 public int getLocationAreaCode() {
 return locationAreaCode;
 }
 public void setLocationAreaCode(int locationAreaCode) {
 this.locationAreaCode = locationAreaCode;
 }
 public String getRadioType() {
 return radioType;
 }
 public void setRadioType(String radioType) {
 this.radioType = radioType;
 }
}
Nach dem Login kopieren

4. Längen- und Breitengraddaten auf der Schnittstelle anzeigen

package com.ljq.activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
public class Gps{
 private Location location = null;
 private LocationManager locationManager = null;
 private Context context = null;
 /**
 * 初始化 
 * 
 * @param ctx
 */
 public Gps(Context ctx) {
 context=ctx;
 locationManager=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
 location = locationManager.getLastKnownLocation(getProvider());
 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
 }
 // 获取Location Provider
 private String getProvider() {
 // 构建位置查询条件
 Criteria criteria = new Criteria();
 // 查询精度:高
 criteria.setAccuracy(Criteria.ACCURACY_FINE);
 // 是否查询海拨:否
 criteria.setAltitudeRequired(false);
 // 是否查询方位角 : 否
 criteria.setBearingRequired(false);
 // 是否允许付费:是
 criteria.setCostAllowed(true);
 // 电量要求:低
 criteria.setPowerRequirement(Criteria.POWER_LOW);
 // 返回最合适的符合条件的provider,第2个参数为true说明 , 如果只有一个provider是有效的,则返回当前provider
 return locationManager.getBestProvider(criteria, true);
 }
 private LocationListener locationListener = new LocationListener() {
 // 位置发生改变后调用
 public void onLocationChanged(Location l) {
  if(l!=null){
  location=l;
  }
 }
 // provider 被用户关闭后调用
 public void onProviderDisabled(String provider) {
  location=null;
 }
 // provider 被用户开启后调用
 public void onProviderEnabled(String provider) {
  Location l = locationManager.getLastKnownLocation(provider);
  if(l!=null){
  location=l;
  }
 }
 // provider 状态变化时调用
 public void onStatusChanged(String provider, int status, Bundle extras) {
 }
 };
 public Location getLocation(){
 return location;
 }
 public void closeLocation(){
 if(locationManager!=null){
  if(locationListener!=null){
  locationManager.removeUpdates(locationListener);
  locationListener=null;
  }
  locationManager=null;
 }
 }
}
Nach dem Login kopieren

5

package com.ljq.activity;
import java.util.ArrayList;
import android.app.Service;
import android.content.Intent;
import android.location.Location;
import android.os.IBinder;
import android.util.Log;
public class GpsService extends Service {
 ArrayList<CellInfo> cellIds = null;
 private Gps gps=null;
 private boolean threadDisable=false; 
 private final static String TAG=GpsService.class.getSimpleName();
 @Override
 public void onCreate() {
 super.onCreate();
 gps=new Gps(GpsService.this);
 cellIds=UtilTool.init(GpsService.this);
 new Thread(new Runnable(){
  @Override
  public void run() {
  while (!threadDisable) { 
   try {
   Thread.sleep(1000);
   } catch (InterruptedException e) {
   e.printStackTrace();
   }
   if(gps!=null){ //当结束服务时gps为空
   //获取经纬度
   Location location=gps.getLocation();
   //如果gps无法获取经纬度,改用基站定位获取
   if(location==null){
    Log.v(TAG, "gps location null"); 
    //2.根据基站信息获取经纬度
    try {
    location = UtilTool.callGear(GpsService.this, cellIds);
    } catch (Exception e) {
    location=null;
    e.printStackTrace();
    }
    if(location==null){
    Log.v(TAG, "cell location null"); 
    }
   }
   //发送广播
   Intent intent=new Intent();
   intent.putExtra("lat", location==null?"":location.getLatitude()+""); 
   intent.putExtra("lon", location==null?"":location.getLongitude()+""); 
   intent.setAction("com.ljq.activity.GpsService"); 
   sendBroadcast(intent);
   }
  }
  }
 }).start();
 }
 @Override
 public void onDestroy() {
 threadDisable=true;
 if(cellIds!=null&&cellIds.size()>0){
  cellIds=null;
 }
 if(gps!=null){
  gps.closeLocation();
  gps=null;
 }
 super.onDestroy();
 }
 @Override
 public IBinder onBind(Intent arg0) {
 return null;
 }
}
Nach dem Login kopieren

6. main.xml–>Layoutdatei

package com.ljq.activity;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;
public class GpsActivity extends Activity {
 private Double homeLat=26.0673834d; //宿舍纬度
 private Double homeLon=119.3119936d; //宿舍经度
 private EditText editText = null;
 private MyReceiver receiver=null; 
 private final static String TAG=GpsActivity.class.getSimpleName();
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 editText=(EditText)findViewById(R.id.editText);
 //判断GPS是否可用
 Log.i(TAG, UtilTool.isGpsEnabled((LocationManager)getSystemService(Context.LOCATION_SERVICE))+"");
 if(!UtilTool.isGpsEnabled((LocationManager)getSystemService(Context.LOCATION_SERVICE))){
  Toast.makeText(this, "GSP当前已禁用,请在您的系统设置屏幕启动。", Toast.LENGTH_LONG).show();
  Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
  startActivity(callGPSSettingIntent);
      return;
 }  
 //启动服务
 startService(new Intent(this, GpsService.class));
 //注册广播
 receiver=new MyReceiver();
 IntentFilter filter=new IntentFilter();
 filter.addAction("com.ljq.activity.GpsService");
 registerReceiver(receiver, filter);
 }
 //获取广播数据
 private class MyReceiver extends BroadcastReceiver{
 @Override
 public void onReceive(Context context, Intent intent) {
  Bundle bundle=intent.getExtras();   
  String lon=bundle.getString("lon");  
  String lat=bundle.getString("lat"); 
  if(lon!=null&&!"".equals(lon)&&lat!=null&&!"".equals(lat)){
  double distance=getDistance(Double.parseDouble(lat), 
   Double.parseDouble(lon), homeLat, homeLon);
  editText.setText("目前经纬度\n经度:"+lon+"\n纬度:"+lat+"\n离宿舍距离:"+java.lang.Math.abs(distance));
  }else{
  editText.setText("目前经纬度\n经度:"+lon+"\n纬度:"+lat);
  }
 }
 }
 @Override
 protected void onDestroy() {
 //注销服务
 unregisterReceiver(receiver);
 //结束服务,如果想让服务一直运行就注销此句
 stopService(new Intent(this, GpsService.class));
 super.onDestroy();
 }
 /**
 * 把经纬度换算成距离
 * 
 * @param lat1 开始纬度
 * @param lon1 开始经度
 * @param lat2 结束纬度
 * @param lon2 结束经度
 * @return
 */
 private double getDistance(double lat1, double lon1, double lat2, double lon2) {
 float[] results = new float[1];
 Location.distanceBetween(lat1, lon1, lat2, lon2, results);
 return results[0];
 } 
}
Nach dem Login kopieren

7. Manifestdatei

package com.ljq.activity;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.telephony.NeighboringCellInfo;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.util.Log;
import android.widget.Toast;
public class UtilTool {
 public static boolean isGpsEnabled(LocationManager locationManager) {
 boolean isOpenGPS = locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER);
 boolean isOpenNetwork = locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER);
 if (isOpenGPS || isOpenNetwork) {
  return true;
 }
 return false;
 } 
  /**
   * 根据基站信息获取经纬度 
   * 
   * 原理向http://www.google.com/loc/json发送http的post请求,根据google返回的结果获取经纬度
   * 
   * @param cellIds
   * @return
   * @throws Exception 
   */
  public static Location callGear(Context ctx, ArrayList<CellInfo> cellIds) throws Exception {
   String result="";
   JSONObject data=null;
   if (cellIds == null||cellIds.size()==0) {
   UtilTool.alert(ctx, "cell request param null");
   return null;
   };
 try {
  result = UtilTool.getResponseResult(ctx, "http://www.google.com/loc/json", cellIds);
  if(result.length() <= 1)
  return null;
  data = new JSONObject(result);
  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(UtilTool.getUTCTime());
  return loc;
 } catch (JSONException e) {
  return null;
 } catch (UnsupportedEncodingException e) {
  e.printStackTrace();
 } catch (ClientProtocolException e) {
  e.printStackTrace();
 } catch (IOException e) {
  e.printStackTrace();
 }
 return null;
 }
  /**
   * 接收Google返回的数据格式
   * 
 * 出参:{"location":{"latitude":26.0673834,"longitude":119.3119936,
 *    "address":{"country":"中国","country_code":"CN","region":"福建省","city":"福州市",
 *    "street":"五一中路","street_number":"128号"},"accuracy":935.0},
 *    "access_token":"2:xiU8YrSifFHUAvRJ:aj9k70VJMRWo_9_G"}
 * 请求路径:http://maps.google.cn/maps/geo?key=abcdefg&q=26.0673834,119.3119936
   * 
   * @param cellIds
   * @return
   * @throws UnsupportedEncodingException
   * @throws MalformedURLException
   * @throws IOException
   * @throws ProtocolException
   * @throws Exception
   */
 public static String getResponseResult(Context ctx,String path, ArrayList<CellInfo> cellInfos)
  throws UnsupportedEncodingException, MalformedURLException,
  IOException, ProtocolException, Exception {
 String result="";
 Log.i(ctx.getApplicationContext().getClass().getSimpleName(), 
  "in param: "+getRequestParams(cellInfos));
 InputStream inStream=UtilTool.sendPostRequest(path, 
  getRequestParams(cellInfos), "UTF-8");
 if(inStream!=null){
  byte[] datas=UtilTool.readInputStream(inStream);
  if(datas!=null&&datas.length>0){
  result=new String(datas, "UTF-8");
  //Log.i(ctx.getClass().getSimpleName(), "receive result:"+result);//服务器返回的结果信息
  Log.i(ctx.getApplicationContext().getClass().getSimpleName(), 
    "google cell receive data result:"+result);
  }else{
  Log.i(ctx.getApplicationContext().getClass().getSimpleName(), 
   "google cell receive data null");
  }
 }else{
  Log.i(ctx.getApplicationContext().getClass().getSimpleName(), 
    "google cell receive inStream null");
 }
 return result;
 }
 /**
 * 拼装json请求参数,拼装基站信息
 * 
 * 入参:{&#39;version&#39;: &#39;1.1.0&#39;,&#39;host&#39;: &#39;maps.google.com&#39;,&#39;home_mobile_country_code&#39;: 460,
 *    &#39;home_mobile_network_code&#39;: 14136,&#39;radio_type&#39;: &#39;cdma&#39;,&#39;request_address&#39;: true,
 *    &#39;address_language&#39;: &#39;zh_CN&#39;,&#39;cell_towers&#39;:[{&#39;cell_id&#39;: &#39;12835&#39;,&#39;location_area_code&#39;: 6,
 *    &#39;mobile_country_code&#39;: 460,&#39;mobile_network_code&#39;: 14136,&#39;age&#39;: 0}]}
 * @param cellInfos
 * @return
 */
 public static String getRequestParams(List<CellInfo> cellInfos){
 StringBuffer sb=new StringBuffer("");
 sb.append("{");
 if(cellInfos!=null&&cellInfos.size()>0){
  sb.append("&#39;version&#39;: &#39;1.1.0&#39;,"); //google api 版本[必]
  sb.append("&#39;host&#39;: &#39;maps.google.com&#39;,"); //服务器域名[必]
  sb.append("&#39;home_mobile_country_code&#39;: "+cellInfos.get(0).getMobileCountryCode()+","); //移动用户所属国家代号[选 中国460]
  sb.append("&#39;home_mobile_network_code&#39;: "+cellInfos.get(0).getMobileNetworkCode()+","); //移动系统号码[默认0]
  sb.append("&#39;radio_type&#39;: &#39;"+cellInfos.get(0).getRadioType()+"&#39;,"); //信号类型[选 gsm|cdma|wcdma]
  sb.append("&#39;request_address&#39;: true,"); //是否返回数据[必]
  sb.append("&#39;address_language&#39;: &#39;zh_CN&#39;,"); //反馈数据语言[选 中国 zh_CN]
  sb.append("&#39;cell_towers&#39;:["); //移动基站参数对象[必]
  for(CellInfo cellInfo:cellInfos){
  sb.append("{");
  sb.append("&#39;cell_id&#39;: &#39;"+cellInfo.getCellId()+"&#39;,"); //基站ID[必]
  sb.append("&#39;location_area_code&#39;: "+cellInfo.getLocationAreaCode()+","); //地区区域码[必]
  sb.append("&#39;mobile_country_code&#39;: "+cellInfo.getMobileCountryCode()+","); 
  sb.append("&#39;mobile_network_code&#39;: "+cellInfo.getMobileNetworkCode()+",");
  sb.append("&#39;age&#39;: 0"); //使用好久的数据库[选 默认0表示使用最新的数据库]
  sb.append("},");
  }
  sb.deleteCharAt(sb.length()-1);
  sb.append("]");
 }
 sb.append("}");
 return sb.toString();
 }
 /**
 * 获取UTC时间
 * 
 * UTC + 时区差 = 本地时间(北京为东八区)
 * 
 * @return
 */
 public static long getUTCTime() { 
   //取得本地时间
    Calendar cal = Calendar.getInstance(Locale.CHINA);
    //取得时间偏移量
    int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET); 
    //取得夏令时差
    int dstOffset = cal.get(java.util.Calendar.DST_OFFSET); 
    //从本地时间里扣除这些差量,即可以取得UTC时间
    cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset)); 
    return cal.getTimeInMillis();
  }
 /**
 * 初始化,记得放在onCreate()方法里初始化,获取基站信息
 * 
 * @return
 */
 public static ArrayList<CellInfo> init(Context ctx) {
 ArrayList<CellInfo> cellInfos = new ArrayList<CellInfo>();
 TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
 //网络制式
 int type = tm.getNetworkType();
   /**
   * 获取SIM卡的IMSI码
   * SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志,
   * 储存在SIM卡中,可用于区别移动用户的有效信息。IMSI由MCC、MNC、MSIN组成,其中MCC为移动国家号码,由3位数字组成,
   * 唯一地识别移动客户所属的国家,我国为460;MNC为网络id,由2位数字组成,
   * 用于识别移动客户所归属的移动网络,中国移动为00,中国联通为01,中国电信为03;MSIN为移动客户识别码,采用等长11位数字构成。
   * 唯一地识别国内GSM移动通信网中移动客户。所以要区分是移动还是联通,只需取得SIM卡中的MNC字段即可
  */
 String imsi = tm.getSubscriberId(); 
 alert(ctx, "imsi: "+imsi);
 //为了区分移动、联通还是电信,推荐使用imsi来判断(万不得己的情况下用getNetworkType()判断,比如imsi为空时)
 if(imsi!=null&&!"".equals(imsi)){ 
  alert(ctx, "imsi");
  if (imsi.startsWith("46000") || imsi.startsWith("46002")) {// 因为移动网络编号46000下的IMSI已经用完,所以虚拟了一个46002编号,134/159号段使用了此编号
  // 中国移动
  mobile(cellInfos, tm);
  } else if (imsi.startsWith("46001")) {
  // 中国联通
  union(cellInfos, tm);
  } else if (imsi.startsWith("46003")) {
  // 中国电信
  cdma(cellInfos, tm);
  }  
 }else{
  alert(ctx, "type");
  // 在中国,联通的3G为UMTS或HSDPA,电信的3G为EVDO
  // 在中国,移动的2G是EGDE,联通的2G为GPRS,电信的2G为CDMA
  // String OperatorName = tm.getNetworkOperatorName(); 
  //中国电信 
  if (type == TelephonyManager.NETWORK_TYPE_EVDO_A 
   || type == TelephonyManager.NETWORK_TYPE_EVDO_0
   || type == TelephonyManager.NETWORK_TYPE_CDMA 
   || type ==TelephonyManager.NETWORK_TYPE_1xRTT){
  cdma(cellInfos, tm);
  }
  //移动(EDGE(2.75G)是GPRS(2.5G)的升级版,速度比GPRS要快。目前移动基本在国内升级普及EDGE,联通则在大城市部署EDGE。)
  else if(type == TelephonyManager.NETWORK_TYPE_EDGE
   || type == TelephonyManager.NETWORK_TYPE_GPRS ){
  mobile(cellInfos, tm);
  }
  //联通(EDGE(2.75G)是GPRS(2.5G)的升级版,速度比GPRS要快。目前移动基本在国内升级普及EDGE,联通则在大城市部署EDGE。)
  else if(type == TelephonyManager.NETWORK_TYPE_GPRS
   ||type == TelephonyManager.NETWORK_TYPE_EDGE
   ||type == TelephonyManager.NETWORK_TYPE_UMTS
   ||type == TelephonyManager.NETWORK_TYPE_HSDPA){
  union(cellInfos, tm);
  }
 }
 return cellInfos;
 }
 /**
 * 电信
 * 
 * @param cellInfos
 * @param tm
 */
 private static void cdma(ArrayList<CellInfo> cellInfos, TelephonyManager tm) {
 CdmaCellLocation location = (CdmaCellLocation) tm.getCellLocation();
 CellInfo info = new CellInfo();
 info.setCellId(location.getBaseStationId());
 info.setLocationAreaCode(location.getNetworkId());
 info.setMobileNetworkCode(String.valueOf(location.getSystemId()));
 info.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
 info.setRadioType("cdma");
 cellInfos.add(info);
 //前面获取到的都是单个基站的信息,接下来再获取周围邻近基站信息以辅助通过基站定位的精准性
 // 获得邻近基站信息
 List<NeighboringCellInfo> list = tm.getNeighboringCellInfo();
 int size = list.size();
 for (int i = 0; i < size; i++) {
  CellInfo cell = new CellInfo();
  cell.setCellId(list.get(i).getCid());
  cell.setLocationAreaCode(location.getNetworkId());
  cell.setMobileNetworkCode(String.valueOf(location.getSystemId()));
  cell.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
  cell.setRadioType("cdma");
  cellInfos.add(cell);
 }
 }
 /**
 * 移动
 * 
 * @param cellInfos
 * @param tm
 */
 private static void mobile(ArrayList<CellInfo> cellInfos,
  TelephonyManager tm) {
 GsmCellLocation location = (GsmCellLocation)tm.getCellLocation(); 
 CellInfo info = new CellInfo();
 info.setCellId(location.getCid());
 info.setLocationAreaCode(location.getLac());
 info.setMobileNetworkCode(tm.getNetworkOperator().substring(3, 5));
 info.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
 info.setRadioType("gsm");
 cellInfos.add(info);
 //前面获取到的都是单个基站的信息,接下来再获取周围邻近基站信息以辅助通过基站定位的精准性
 // 获得邻近基站信息
 List<NeighboringCellInfo> list = tm.getNeighboringCellInfo();
 int size = list.size();
 for (int i = 0; i < size; i++) {
  CellInfo cell = new CellInfo();
  cell.setCellId(list.get(i).getCid());
  cell.setLocationAreaCode(location.getLac());
  cell.setMobileNetworkCode(tm.getNetworkOperator().substring(3, 5));
  cell.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
  cell.setRadioType("gsm");
  cellInfos.add(cell);
 }
 }
 /**
 * 联通
 * 
 * @param cellInfos
 * @param tm
 */
 private static void union(ArrayList<CellInfo> cellInfos, TelephonyManager tm) {
 GsmCellLocation location = (GsmCellLocation)tm.getCellLocation(); 
 CellInfo info = new CellInfo();
 //经过测试,获取联通数据以下两行必须去掉,否则会出现错误,错误类型为JSON Parsing Error
 //info.setMobileNetworkCode(tm.getNetworkOperator().substring(3, 5)); 
 //info.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
 info.setCellId(location.getCid());
 info.setLocationAreaCode(location.getLac());
 info.setMobileNetworkCode("");
 info.setMobileCountryCode("");
 info.setRadioType("gsm");
 cellInfos.add(info);
 //前面获取到的都是单个基站的信息,接下来再获取周围邻近基站信息以辅助通过基站定位的精准性
 // 获得邻近基站信息
 List<NeighboringCellInfo> list = tm.getNeighboringCellInfo();
 int size = list.size();
 for (int i = 0; i < size; i++) {
  CellInfo cell = new CellInfo();
  cell.setCellId(list.get(i).getCid());
  cell.setLocationAreaCode(location.getLac());
  cell.setMobileNetworkCode("");
  cell.setMobileCountryCode("");
  cell.setRadioType("gsm");
  cellInfos.add(cell);
 }
 }
 /**
 * 提示
 * 
 * @param ctx
 * @param msg
 */
 public static void alert(Context ctx,String msg){
 Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
 }
 /**
 * 发送post请求,返回输入流
 * 
 * @param path 访问路径
 * @param params json数据格式
 * @param encoding 编码
 * @return
 * @throws UnsupportedEncodingException
 * @throws MalformedURLException
 * @throws IOException
 * @throws ProtocolException
 */
 public static InputStream sendPostRequest(String path, String params, String encoding)
 throws UnsupportedEncodingException, MalformedURLException,
 IOException, ProtocolException {
 byte[] data = params.getBytes(encoding);
 URL url = new URL(path);
 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
 conn.setRequestMethod("POST");
 conn.setDoOutput(true);
 //application/x-javascript text/xml->xml数据 application/x-javascript->json对象 application/x-www-form-urlencoded->表单数据
 conn.setRequestProperty("Content-Type", "application/x-javascript; charset="+ encoding);
 conn.setRequestProperty("Content-Length", String.valueOf(data.length));
 conn.setConnectTimeout(5 * 1000);
 OutputStream outStream = conn.getOutputStream();
 outStream.write(data);
 outStream.flush();
 outStream.close();
 if(conn.getResponseCode()==200)
  return conn.getInputStream();
 return null;
 }
 /**
 * 发送get请求
 * 
 * @param path 请求路径
 * @return
 * @throws Exception
 */
 public static String sendGetRequest(String path) throws Exception {
 URL url = new URL(path);
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.setConnectTimeout(5 * 1000);
 conn.setRequestMethod("GET");
 InputStream inStream = conn.getInputStream();
 byte[] data = readInputStream(inStream);
 String result = new String(data, "UTF-8");
 return result;
 }
 /**
 * 从输入流中读取数据
 * @param inStream
 * @return
 * @throws Exception
 */
 public static byte[] readInputStream(InputStream inStream) throws Exception{
 ByteArrayOutputStream outStream = new ByteArrayOutputStream();
 byte[] buffer = new byte[1024];
 int len = 0;
 while( (len = inStream.read(buffer)) !=-1 ){
  outStream.write(buffer, 0, len);
 }
 byte[] data = outStream.toByteArray();//网页的二进制数据
 outStream.close();
 inStream.close();
 return data;
 }
}
Nach dem Login kopieren

Der Effekt ist wie folgt:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
  <EditText android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:cursorVisible="false"
    android:editable="false"
    android:id="@+id/editText"/>
</LinearLayout>
Nach dem Login kopieren

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.ljq.activity" android:versionCode="1"
 android:versionName="1.0">
 <application android:icon="@drawable/icon"
 android:label="@string/app_name">
 <activity android:name=".GpsActivity"
  android:label="@string/app_name">
  <intent-filter>
  <action android:name="android.intent.action.MAIN" />
  <category
   android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
 </activity>
 <service android:label="GPS服务" android:name=".GpsService" />
 </application>
 <uses-sdk android:minSdkVersion="7" />
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</manifest>
Nach dem Login kopieren
Ich hoffe, dass die Beschreibung in diesem Artikel für das Android-Programmierdesign aller hilfreich sein wird.

Weitere verwandte Artikel darüber, wie Android den Dienst zum Abrufen des aktuellen Standorts (GPS + Basisstation) implementiert, finden Sie auf der chinesischen PHP-Website!

Wie Android den Dienst implementiert, um den aktuellen Standort zu ermitteln (GPS + Basisstation)

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage