• 18、GPS技术


    GPS核心API

          Android SDK为GPS提供了很多API,其中LocationManager类是这些API的核心。LocationManager是一个系统服务类,与TelephonyManager、AudioManager等服务类的作用和创建服务类对象的方法类似。所有与GPS相关的操作都由LocationManager对象及其派生的对象完成。

    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

         LocationProvider类可以获取与位置提供者相关的信息。

         Location类是对具体位置信息的抽象表示。

    获取位置提供者

          使用GPS定位的关键之一就是获取LocationProvider,每一个LocationProvider对象都表示一个抽象的定位系统。无论使用GPS做什么,都需要首先获取合适的LocationProvider对象。

    # 获取所有可用的LocationProvider(demo)。
     1 import java.util.List;
     2 import android.app.Activity;
     3 import android.content.Context;
     4 import android.location.LocationManager;
     5 import android.os.Bundle;
     6 import android.widget.ArrayAdapter;
     7 import android.widget.ListView;
     8 
     9 /**
    10  * 得到 所有的LocationProvider。
    11  * @author dr
    12  *
    13  */
    14 public class AllProvidersActivity extends Activity {
    15     ListView mProviders;
    16     LocationManager mLocationManager;
    17 
    18     @Override
    19     public void onCreate(Bundle savedInstanceState) {
    20         super.onCreate(savedInstanceState);
    21         setContentView(R.layout.main);
    22 
    23         mProviders = (ListView) findViewById(R.id.providers);
    24 
    25         // 首先应获取LocationManager对象
    26         mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    27 
    28         // 获取所有的LocationProvder的名称
    29         List<String> providerNames = mLocationManager.getAllProviders();
    30 
    31         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
    32                 android.R.layout.simple_list_item_1, providerNames);
    33 
    34         mProviders.setAdapter(adapter);
    35     }
    36 }
     
    # 根据条件(Criteria)获取LocationProvider(demo)。
     
     

    根据名称获取LocationProvider

    1 //  获取passive Location Provider
    2 LocationProvider passiveProvider =
    3 mLocationManager.getProvider(LocationManager.PASSIVE_PROVIDER);
    4 //  获取gps Location Provider
    5 LocationProvider gpsProvider =
    6                mLocationManager.getProvider(LocationManager.GPS_PROVIDER);
    7 //  获取network Location Provider
    8 LocationProvider passiveProvider =
    9                mLocationManager.getProvider(LocationManager.NETWORK_PROVIDER);
    实时获取GPS定位数据
     
     1 import android.app.Activity;
     2 import android.content.Context;
     3 import android.location.Location;
     4 import android.location.LocationListener;
     5 import android.location.LocationManager;
     6 import android.os.Bundle;
     7 import android.widget.EditText;
     8 
     9 public class LocationActivity extends Activity {
    10     LocationManager mLocationManager;
    11     EditText mEditText;
    12 
    13     @Override
    14     public void onCreate(Bundle savedInstanceState) {
    15         super.onCreate(savedInstanceState);
    16         setContentView(R.layout.main);
    17 
    18         mEditText = (EditText) findViewById(R.id.show);
    19 
    20         mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    21 
    22         // 从GPS获取最近的定位信息
    23         Location location = mLocationManager
    24                 .getLastKnownLocation(LocationManager.GPS_PROVIDER);
    25 
    26         updateView(location);
    27 
    28         // 2000(2秒), 8(米)。
    29         mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
    30                 2000, 8, new LocationListener() {
    31 
    32                     @Override
    33                     public void onStatusChanged(String provider, int status,
    34                             Bundle extras) {
    35                         // TODO Auto-generated method stub
    36                     }
    37 
    38                     @Override
    39                     public void onProviderEnabled(String provider) {
    40                         // 当GPS Location Provider可用时,更新位置
    41                         updateView(mLocationManager
    42                                 .getLastKnownLocation(provider));
    43                     }
    44 
    45                     @Override
    46                     public void onProviderDisabled(String provider) {
    47                         // TODO Auto-generated method stub
    48                     }
    49 
    50                     @Override  // 位置发生变化。
    51                     public void onLocationChanged(Location location) {
    52                         // 当GPS定位信息发生改变时,更新位置
    53                         updateView(location);
    54                     }
    55                 });
    56 
    57     }
    58 
    59     // 用来更新EditText中的信息
    60     public void updateView(Location newLocation) {
    61         if (newLocation != null) {
    62             StringBuilder sb = new StringBuilder();
    63             sb.append("实时的位置信息:
    ");
    64             sb.append("经度:");
    65             sb.append(newLocation.getLongitude());
    66             sb.append("
    纬度:");
    67             sb.append(newLocation.getLatitude());
    68             sb.append("高度:");
    69             sb.append(newLocation.getAltitude());
    70             sb.append("
    速度:");
    71             sb.append(newLocation.getSpeed());
    72             sb.append("
    方向:");
    73             sb.append(newLocation.getBearing());
    74             mEditText.setText(sb.toString());
    75 
    76         }
    77     }
    78 }
    <!-- 授权获取定位信息 -->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    测量地球上任意两点之间的距离
     
    1 mEditText = (EditText) findViewById(R.id.edittext);
    2         final float[] results = new float[3];
    3 
    4         Location.distanceBetween(20.123, 30.05644, 30.124, 40.543, results);
    5         mEditText.setText(String.valueOf(results[0]) + "米");
    邻近警告
     
     1 import mobile.android.proximity.alert.R;
     2 import android.app.Activity;
     3 import android.app.PendingIntent;
     4 import android.content.Context;
     5 import android.content.Intent;
     6 import android.location.LocationManager;
     7 import android.os.Bundle;
     8 
     9 public class ProximityAlertActivity extends Activity {
    10     @Override
    11     public void onCreate(Bundle savedInstanceState) {
    12         super.onCreate(savedInstanceState);
    13         setContentView(R.layout.main);
    14 
    15         LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    16 
    17         double longitude = 123.427109;
    18         double latitude = 41.764998;
    19         float radius = 2000;  //距离中心点半径,单位:米。
    20 
    21         Intent intent = new Intent(this, PromimityAlertRecivery.class);
    22 
    23         // 任何情况下都可以发intent,除非关机。intent的话如果关闭当前activity或者程序,将终止。
    24         PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1,
    25                 intent, 0);
    26         
    27         locationManager.addProximityAlert(latitude, longitude, radius, -1,
    28                 pendingIntent);
    29     }
    30 }
     1 import android.content.Context;
     2 import android.content.Intent;
     3 import android.location.LocationManager;
     4 import android.widget.Toast;
     5 
     6 /**
     7  * 广播接收器
     8  * @author dr
     9  */
    10 public class PromimityAlertRecivery {
    11     public void onReceive(Context context, Intent intent) {
    12         // 获取是否进入指定区域
    13         boolean isEnter = intent.getBooleanExtra(
    14                 LocationManager.KEY_PROXIMITY_ENTERING, false);
    15         if (isEnter) {
    16             Toast.makeText(context, "您已经进入指定区域", Toast.LENGTH_LONG).show();
    17         } else {
    18             Toast.makeText(context, "您已经离开指定区域", Toast.LENGTH_LONG).show();
    19         }
    20     }
    21 }
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="mobile.android.proximity.alert"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name="cn.proximity.alert.ProximityAlertActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <receiver android:name="cn.proximity.alert.ProximityAlertReciever" />
        </application>
        <!-- 授权获取定位信息 -->
        <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"/>
    
    </manifest> 
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    实现倒计时
    slidingMenu使用中侧滑回界面后,出现无焦点问题
    android eclipse 下Device无设备问题解决
    android cordova java.lang.Throwable: EventHub.removeMessages(int what = 107) is not supported before the WebViewCore is set up问题的解决和想法
    Android Cordova 对于软键盘弹出后覆盖输入域的解决
    Extjs最后一页数据删除之后自动返回上一页
    jquery Unexpected token i
    批量删除.svn文件夹、.svn文件
    mysql创建用户权限
    mysql存储过程解决数组传参及游标CURSOR的问题解决方案
  • 原文地址:https://www.cnblogs.com/androidsj/p/3857284.html
Copyright © 2020-2023  润新知