Android が現在位置を取得するサービスを実装する方法 (GPS + 基地局)

高洛峰
リリース: 2017-01-07 15:06:30
オリジナル
2810 人が閲覧しました

この記事の例では、Android が現在の位置 (GPS + 基地局) を取得するサービスを実装する方法を説明します。皆さんの参考に共有してください。詳細は以下のとおりです。

要件の詳細:

1)、サービス内で測位演算 (GPS + 基地局) が 1 秒ごとに実行されます
2)、測位結果がリアルタイムでインターフェイスに表示されます (経度および基地局が必要です)緯度)

技術サポート :

1)、緯度と経度を取得します
GPS + 基地局を通じて緯度と経度を取得します。まず GPS を通じて取得します。空の場合は、基地局を使用して取得します -> GPS + 基地局 (基地局取得はチャイナユニコム、チャイナテレコム、チャイナモバイルをサポート)。
2) リアルタイムの緯度・経度取得
リアルタイムの緯度・経度を取得するには、バックグラウンドで緯度・経度を取得するサービスを起動し、経度・緯度データをブロードキャストで送信する必要があります。必要に応じてブロードキャストを登録します (アクティビティにブロードキャストを登録し、インターフェイス メディアに表示するなど) – > Service+BroadcastReceiver+Activity+Thread などのナレッジ ポイントが含まれます。

注: この記事は実践に重点を置いています。理解できない場合は、まず以前の関連記事を読んでください。

1 緯度経度データのリアルタイム表示

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;
 }
}
ログイン後にコピー

5、UtilTool–>ツールクラス

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;
 }
 }
}
ログイン後にコピー

6、main.xml–>レイアウトファイル

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;
 }
}
ログイン後にコピー

7、マニフェストファイル

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];
 } 
}
ログイン後にコピー

:

この記事がそれを説明しており、皆さんの Android プログラムの設計に役立つことを願っています。

Android が現在位置を取得するためのサービス (GPS + 基地局) を実装する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

Android が現在位置を取得するサービスを実装する方法 (GPS + 基地局)

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート