18、GPS技术
2024-08-25 20:56:59
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)。
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView; /**
* 得到 所有的LocationProvider。
* @author dr
*
*/
public class AllProvidersActivity extends Activity {
ListView mProviders;
LocationManager mLocationManager; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); mProviders = (ListView) findViewById(R.id.providers); // 首先应获取LocationManager对象
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 获取所有的LocationProvder的名称
List<String> providerNames = mLocationManager.getAllProviders(); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, providerNames); mProviders.setAdapter(adapter);
}
}
# 根据条件(Criteria)获取LocationProvider(demo)。
根据名称获取LocationProvider
// 获取passive Location Provider
LocationProvider passiveProvider =
mLocationManager.getProvider(LocationManager.PASSIVE_PROVIDER);
// 获取gps Location Provider
LocationProvider gpsProvider =
mLocationManager.getProvider(LocationManager.GPS_PROVIDER);
// 获取network Location Provider
LocationProvider passiveProvider =
mLocationManager.getProvider(LocationManager.NETWORK_PROVIDER);
实时获取GPS定位数据
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.EditText; public class LocationActivity extends Activity {
LocationManager mLocationManager;
EditText mEditText; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); mEditText = (EditText) findViewById(R.id.show); mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 从GPS获取最近的定位信息
Location location = mLocationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER); updateView(location); // 2000(2秒), 8(米)。
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
2000, 8, new LocationListener() { @Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
// TODO Auto-generated method stub
} @Override
public void onProviderEnabled(String provider) {
// 当GPS Location Provider可用时,更新位置
updateView(mLocationManager
.getLastKnownLocation(provider));
} @Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
} @Override // 位置发生变化。
public void onLocationChanged(Location location) {
// 当GPS定位信息发生改变时,更新位置
updateView(location);
}
}); } // 用来更新EditText中的信息
public void updateView(Location newLocation) {
if (newLocation != null) {
StringBuilder sb = new StringBuilder();
sb.append("实时的位置信息:\n");
sb.append("经度:");
sb.append(newLocation.getLongitude());
sb.append("\n纬度:");
sb.append(newLocation.getLatitude());
sb.append("\b高度:");
sb.append(newLocation.getAltitude());
sb.append("\n速度:");
sb.append(newLocation.getSpeed());
sb.append("\n方向:");
sb.append(newLocation.getBearing());
mEditText.setText(sb.toString()); }
}
}
<!-- 授权获取定位信息 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
测量地球上任意两点之间的距离
mEditText = (EditText) findViewById(R.id.edittext);
final float[] results = new float[3]; Location.distanceBetween(20.123, 30.05644, 30.124, 40.543, results);
mEditText.setText(String.valueOf(results[0]) + "米");
邻近警告
import mobile.android.proximity.alert.R;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.os.Bundle; public class ProximityAlertActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); double longitude = 123.427109;
double latitude = 41.764998;
float radius = 2000; //距离中心点半径,单位:米。 Intent intent = new Intent(this, PromimityAlertRecivery.class); // 任何情况下都可以发intent,除非关机。intent的话如果关闭当前activity或者程序,将终止。
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1,
intent, 0); locationManager.addProximityAlert(latitude, longitude, radius, -1,
pendingIntent);
}
}
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.widget.Toast; /**
* 广播接收器
* @author dr
*/
public class PromimityAlertRecivery {
public void onReceive(Context context, Intent intent) {
// 获取是否进入指定区域
boolean isEnter = intent.getBooleanExtra(
LocationManager.KEY_PROXIMITY_ENTERING, false);
if (isEnter) {
Toast.makeText(context, "您已经进入指定区域", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(context, "您已经离开指定区域", Toast.LENGTH_LONG).show();
}
}
}
<?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>
最新文章
- JS preventDefault ,stopPropagation ,return false
- javascript每天一题
- Python的高级特性6:使用__slots__真的能省很多内存
- Virtualbox修改bios信息安装Windows XP OEM
- ASP.NET MVC API 路由生成规则
- Json对象与Json字符串互转
- 增强学习————K-摇臂赌博机
- 【LeetCode】6 - ZigZag Conversion
- TortoiseGit无法勾选Load Putty Key,该选项为灰色的解决办法
- 加入强调语气,使用<;strong>;和<;em>;标签
- C++ STL set集合容器
- Qt跨线程信号和槽的连接(默认方式是直连和队列的折中)
- Java编译成功,用java 运行class时出现错误解决方法
- Web学习-jsp实现servlet过程赏析
- 给新手--安装tomcat后username和password设置以及项目怎么部署在tomcatserver上
- PHP简单的长文章分页教程 附源码
- 变量和关系符和JAVA基本类型笔记与常考面试题
- disconf-自动注入属性变化
- setOnPageChangeListener 过时了怎么办?
- 使用Fiddler远程抓包