标签:etc alt generated return 地址 ring hit disable 时间间隔
转载请注明出处:http://blog.csdn.net/smartbetter/article/details/50425041
今天给大家带来的是一篇关于GPS定位的文章,我们都知道,Android定位大致分为wifi定位,基站定位和GPS定位,今天我就带大家来看看GPS定位是什么玩意,通过本篇的学习,相信大家能很快上手GPS定位操作了。GPS定位是通过和GPS定位卫星通讯来进行定位的,可以使用最少数量的卫星实现全球定位,3颗,通过光波进行通讯,不需要联网,但是连接时间比较长,大致1分钟左右吧。好了,大致有个了解了,接下来我们开始进入GPS实践篇章吧,通过本篇的学习后,挑战一下一分钟实现GPS定位你自己的坐标吧,哈哈。
1.wifi定位,ip地址定位,通过ip地址进行查询实际地址;
2.基站定位,信号塔,基站:手机通讯服务的设备 ,信号的格数决定了手机距离基站远近,精确度:几十米到几公里,精确度来自于基站的数量
wifi定位和基站定位局限性:不能定位海拔;
3.GPS定位,通过和GPS定位卫星通讯进行定位的,使用最少卫星实现全球定位,3颗,通过光波进行通讯,不需要联网,连接时间比较长,1分钟,比较费电,AGPS技术,通过联网来修正GPS定位坐标,AGPS技术需要联网,GPS不需要联网;
public class MainActivity extends Activity {
private LocationManager locationManager;
private TextView textview1;
private MyLocationListener myLocationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview1 = (TextView) findViewById(R.id.textview1);
//1.获取位置的管理者
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
//2.获取定位方式
//2.1获取所有的定位方式,true:表示返回所有可用定位方式
List<String> providers = locationManager.getProviders(true);
for (String string : providers) {
System.out.println(string);
}
//2.2获取最佳的定位方式
Criteria criteria = new Criteria();
criteria.setAltitudeRequired(true);//设置是否可以定位海拔,如果设置定位海拔,返回一定是gps
//criteria : 设置定位属性
//enabledOnly : true如果定位可用就返回
String bestProvider = locationManager.getBestProvider(criteria, true);
System.out.println("最佳的定位方式:"+bestProvider);
//3.定位
myLocationListener = new MyLocationListener();
//provider : 定位的方式
//minTime : 定位的最小时间间隔
//minDistance : 定位最小的间隔距离
//LocationListener : 定位监听
locationManager.requestLocationUpdates(bestProvider, 0, 0, myLocationListener);
}
private class MyLocationListener implements LocationListener{
//当定位位置改变的调用的方法
//Location : 当前的位置
@Override
public void onLocationChanged(Location location) {
location.getAccuracy();//获取精确位置
location.getAltitude();//获取海拔
double latitude = location.getLatitude();//获取纬度,平行于赤道
double longitude = location.getLongitude();//获取经度,垂直于赤道
textview1.setText("longitude:"+longitude+" latitude:"+latitude);
}
//当定位状态发生改变的时候调用的方式
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
//当定位可用的时候调用的方法
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
//当定位不可用的时候调用的方法
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
}
@Override
protected void onDestroy() {
super.onDestroy();
locationManager.removeUpdates(myLocationListener);//关闭gps,但是高版本中规定打开和关闭gps必须由用户自己主观的去实现,代码已经不允许进行操作
}
}<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>android.permission.ACCESS_MOCK_LOCATION : 模拟位置的权限,模拟器中必须添加,真机可加可不加 android.permission.ACCESS_FINE_LOCATION : 精确位置的权限,都必须添加 android.permission.ACCESS_COARSE_LOCATION : 大概位置的权限,都必须添加
打开百度坐标拾取系统,进行坐标反查,(勾选坐标反查,百度搜索框中填入:经度,纬度),点击百度一下。
注意:会有一定误差
原因:是一种国家保密插件,也叫做加密插件或者加偏或者SM模组,其实就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。而加密后的坐标也常被人称为火星坐标系统。
算法纠正
1.问题:广播接受者中的onReceive方法执行时间不能超过10秒,超过了就不会再执行代码了,而GPS连接需要1分钟左右
解决方案:a.开启一个服务,让该服务在后台运行,在服务中不断的进行定位操作,代码如下:
public class GPSService extends Service {
private LocationManager locationManager;
private MyLocationListener myLocationListener;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
// 1.获取位置的管理者
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
// 2.获取定位方式
// 2.1获取所有的定位方式,true:表示返回所有可用定位方式
List<String> providers = locationManager.getProviders(true);
for (String string : providers) {
System.out.println(string);
}
// 2.2获取最佳的定位方式
Criteria criteria = new Criteria();
criteria.setAltitudeRequired(true);// 设置是否可以定位海拔,如果设置定位海拔,返回一定是gps
// criteria : 设置定位属性
// enabledOnly : true如果定位可用就返回
String bestProvider = locationManager.getBestProvider(criteria, true);
System.out.println("最佳的定位方式:" + bestProvider);
// 3.定位
myLocationListener = new MyLocationListener();
// provider : 定位的方式
// minTime : 定位的最小时间间隔
// minDistance : 定位最小的间隔距离
// LocationListener : 定位监听
locationManager.requestLocationUpdates(bestProvider, 0, 0,
myLocationListener);
}
private class MyLocationListener implements LocationListener{
//当定位位置改变的调用的方法
//Location : 当前的位置
@Override
public void onLocationChanged(Location location) {
location.getAccuracy();//获取精确位置
location.getAltitude();//获取海拔
double latitude = location.getLatitude();//获取纬度,平行
double longitude = location.getLongitude();//获取经度,垂直
//发送坐标给指定手机号码
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("5556", null, "longitude:"+longitude+" latitude:"+latitude, null, null);
//停止服务,但是必须得是startservice开启
stopSelf();
}
//当定位状态发生改变的时候调用的方式
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
//当定位可用的时候调用的方法
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
//当定位不可用的时候调用的方法
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
}
@Override
public void onDestroy() {
super.onDestroy();
locationManager.removeUpdates(myLocationListener);//关闭gps,但是高版本中规定打开和关闭gps必须由用户自己主观的去实现,代码已经不允许进行操作
}
}b.AndroidManifest.xml中配置该服务,并添加权限
<service android:name="com.moblie.location.GPSService"></service>c.在广播接受者中开启服务
Intent gpsIntent = new Intent(context,GPSService.class); context.startService(gpsIntent);
Android GPS定位实现,教你如何一分钟实现GPS定位
标签:etc alt generated return 地址 ring hit disable 时间间隔
原文地址:http://blog.csdn.net/smartbetter/article/details/50425041