生活指南——让生活变得更简单

Android手机定位_android精准定位

课程:

实现Android的不同精度的定位(基于网络和GP

Android中的定位服务的相关类基本上都在android.location包中,下面会按编写的顺序依次讲解。

1.获取位置服务管理器LocationManager

//变量定义

private LocationManager locationManager;

//onCreate()方法中得到LocationManager

locationManager = (LocationManager) this

.getSystemService(Context.LOCATION_SERVICE)

2.开启位置服务的监听

有了LocationManager之后,我们就可以开始监听位置的变化了。我们使用LocationManager中的方法:

requestLocationUpdates(String

provider, long minTime, float minDistance, LocationListener

listener)

来设置监听器。

首先,我们要注意到第1个参数,这个参数的值为2选1,分别是:LocationManager.NETWORK_PROVIDER和LocationManager.GPS_PROVIDER,前者用于移动网络中获取位置,精度较低但速度很快,后者使用GPS进行定位,精度很高但一般需要10-60秒时间才能开始第1次定位,如果是在室内则基本上无法定位。

这2种Provider本质上是互补的,在本教程中,我们会同时开启2个监听,但基于移动网络的监听只会执行一次就会被停止,而基于GPS的监听则会一直持续下去,直至用户自己停止监听。

代码片段如下:

首先,我们会声明1个监听器的内部类,这个类会同时用于2种模式的监听。还要声明1个变量,用于记录当前的位置

private class MyLocationListener implements LocationListener {

Location currentLocation;

@Override

public void onLocationChanged(Location location) {

if (currentLocation != null) {

if (isBetterLocation(location, currentLocation)) {

currentLocation = location;

showLocation(location);

} else {

Toast.makeText(getApplicationContext(), "not very good", Toast.LENGTH_SHORT).show();

}

} else {

currentLocation = location;

showLocation(location);

}

//移除基于LocationManager.NETWORK_PROVIDER的监听器

if (LocationManager.NETWORK_PROVIDER.equals(location.getProvider())) {

if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

// TODO: Consider calling

// ActivityCompat#requestPermissions

// here to request the missing permissions, and then overriding

// public void onRequestPermissionsResult(int requestCode, String[] permissions,

// int[] grantResults)

// to handle the case where the user grants the permission. See the documentation

// for ActivityCompat#requestPermissions for more details.

return;

}

locationManager.removeUpdates(this);

}

}

@Override

public void onStatusChanged(String s, int i, Bundle bundle) {

}

@Override

public void onProviderEnabled(String s) {

}

@Override

public void onProviderDisabled(String s) {

}

private void showLocation(Location location) {

Toast.makeText(getApplication(), "经度:" + location.getLongitude() + ",纬度:" + location.getLatitude() + ",精确度:" + location.getAccuracy(), Toast.LENGTH_SHORT).show();

}

}

3.添加开始监听的代码

首先声明两个全局变量,并定义监听方法registerLocationListener()

private LocationListener gpsListener = null;

private MyLocationListener networkListener = null;

private void registerLocationListener() {

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

// TODO: Consider calling

// ActivityCompat#requestPermissions

// here to request the missing permissions, and then overriding

// public void onRequestPermissionsResult(int requestCode, String[] permissions,

// int[] grantResults)

// to handle the case where the user grants the permission. See the documentation

// for ActivityCompat#requestPermissions for more details.

return;

}

networkListener = new MyLocationListener();

gpsListener = new MyLocationListener();

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, networkListener);

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, gpsListener);

}

以上的代码还是很易懂的吧,创建1个监听器对象,然后指定1个provider,然后requestLocationUpdates。在监听器中检查如果是NETWORK_PROVIDER,则取消监听,只留GPS的监听(在你的实际应用中可以根据情况来进行,因为GPS有可能会因为建筑的阻挡而暂时不工作)。

位置精度的判断在showLocation方法中,我们打印了location的Accuracy属性,这就是精确度,一般来说NETWORK得到的位置精度一般在500-1000米,GPS得到的精度一般在5-50米,基于这个属性我们可以对精度进行判断,以决定是否采用这个精度。

4.增加判断获取的位置是否更好的方法isBetterLocation()

你可能已经注意到上面的代码中有1个isBetterLocation方法,这是用来判断获取的位置是否更好,事实上这个方法来自于Dev

Guide。我们看下这个方法的内容:

protected boolean isBetterLocation(Location location,

Location currentBestLocation) {

if (currentBestLocation == null) {

// A new location is always better than no location

return true;

}

// Check whether the new location fix is newer or older

long timeDelta = location.getTime() - currentBestLocation.getTime();

boolean isSignificantlyNewer = timeDelta CHECK_INTERVAL;

boolean isSignificantlyOlder = timeDelta -CHECK_INTERVAL;

boolean isNewer = timeDelta 0;

// If it's been more than two minutes since the current location,

// use the new location

// because the user has likely moved

if (isSignificantlyNewer) {

return true;

// If the new location is more than two minutes older, it must

// be worse

} else if (isSignificantlyOlder) {

return false;

}

// Check whether the new location fix is more or less accurate

int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation

.getAccuracy());

boolean isLessAccurate = accuracyDelta 0;

boolean isMoreAccurate = accuracyDelta 0;

boolean isSignificantlyLessAccurate = accuracyDelta 200;

// Check if the old and new location are from the same provider

boolean isFromSameProvider = isSameProvider(location.getProvider(),

currentBestLocation.getProvider());

// Determine location quality using a combination of timeliness and

// accuracy

if (isMoreAccurate) {

return true;

} else if (isNewer !isLessAccurate) {

return true;

} else if (isNewer !isSignificantlyLessAccurate

isFromSameProvider) {

return true;

}

return false;

}

/** Checks whether two providers are the same */

private boolean isSameProvider(String provider1, String provider2) {

if (provider1 == null) {

return provider2 == null;

}

return provider1.equals(provider2);

}

从代码中可以很清楚的看出判断位置是否“更好”的准则,不仅使用了精度(getAccuracy()),还使用了时间进行判断。事实上除了在导航应用,其它的时候均可以直接使用上面的这个方法来对位置更新信息进行过滤,以减少不断更新界面而带来的性能损失。

5.结束监听

只需要调用LocationManager对象的removeUpdates(LocationListener listener)方法就可以停止监听。事实上,在之前的代码中你已经看到我们移除了基于移动网络的监听器,下面的代码片段用于移除GPS监听器。

if(gpsListener!=null){

locationManager.removeUpdates(gpsListener);

gpsListener=null;

}

LocationManager的其它使用这里还要介绍LocationManager中的几个方法:

getLastKnownLocation(String

provider),用于得到上次定位时的最后位置,通常在应用刚启动时立刻得到1个位置,这样应用看上去会比较快。

getBestProvider(Criteria

criteria, boolean

enabledOnly),根据条件(精度的高低,是否能够得到海拔等)以及当前是否开启,得到1个最好的位置Provider。看上去很美,但现在的Android系统中只有2个Provider,而大多数用户的GPS都是开启的,在仅仅是2选1的情况我想像不出这个方法的用途。而即便用户关闭了GPS,我们也有能力帮他开启,用完了之后再关掉它。开启的方法见《进阶:如何编程实现开启或关闭GPS?》。

总结2个Provider提供了不同精度的定位服务,我们可以根据情况来使用。

一般来说,先使用NETWORK来得到1个精度较差的位置,再使用GPS来得到更准确的位置。

概括起来就是2句话:“快速反应,渐进式精确”。在实际的使用中也要根据自己的情况画1个时间线,好决定何时开始监听,何时结束监听。

安卓手机如何开启GPS定位服务?

1、首先打开自己的手机,然后找到设置图标,点击进入。

2、进入设置的界面之后,找到并点击高级设置选项。

3、然后进入高级选项的界面之后,找到并点击定位服务。

4、然后进入定位服务界面,点击仅使用gps选项进行勾选即可开启。

手机安卓用哪种定位软件精确

我比较常用的高德地图,其次是百度地图是不错的,支持下载离线地图。

但不移动定位准确的测量和软件的关系,但重要的是看你的手机硬件可以支持同时搜索到的gps卫星信号的数量,能够搜索,月球上的更精确的gps卫星定位。当您打开

作好您的手机gps开关哦!

安卓系统有什么比较好的模拟定位软件

1、虚拟定位精灵:

一款手机定位软件,该软件支持全国任意位置定位功能,集成高德地图技术,一键即可位置至朋友圈,用户确定坐标后,选择前往该坐标,然后登陆微信,然后微信即定位到选择的坐标。可以将该地点发送给好友,或朋友圈,或者查看附近的人,或者向好友发送实时位置。

2、手机定位管家:

一款专注于守护家人和好友安全的专业定位软件。双方可以共享实时定位,定位准确迅速,让你时刻了解家人所处的环境。另外它还有基于智能地图技术的快速提醒功能,当家人进入或者离开常用活动范围,系统会立刻发送相关通知,提高家人的生活安全系数。

3、悟空分身模拟定位:

悟空分身模拟定位是手机分身、定位的软件用户想要同时在设备上登录多个同款社交软件,就可以通过这个平台来进行操作,支持微信分身多开分身工具,集多开分身放桌面、无限多开分身等功能,实现一部手机微信双开,甚至多个微信分身版同时在线。

4、虚拟定位王:

提供了非常精准的模拟定位功能,足不出户虚拟地理位置实现远程打卡,远程签到。一键切换分身位置伪装,支持各种应用与游戏分身变更地理位置,快速伪装地理位置不需要手机ROOT,装好一键即可虚拟地理位置。

5、位移精灵:

款可以手机虚拟定位的多功能手机定位软件,它不光只是手机虚拟定位,还可以应用多开,模拟步数,模拟录音,模拟wifi,模拟拍照,机型伪装,模拟路线等实用功能。位移精灵现已破解所有功能,全部可以免费使用。

安卓手机丢了而且关机怎么定位找回?

安卓手机丢了而且关机定位找回的方法:

方法一:

此方法试用于安装有完整谷歌服务框架的Android手机,部分国行手机可能无法正常使用。谷歌自带了数据备份、定位、防盗(响铃、锁定、清空)等功能,使用该服务,需要在手机上安装谷歌服务框架(在应用市场搜索即可),并登录谷歌账号。

在谷歌服务应用中找到“Google设置”这个应用,选择里面的“Android设备管理器”,选中“远程定位此设备”和“允许远程回复出厂设置”。

手机一旦丢失,打开Android设备管理器网页,可以看到白色方框右上角的“定位”,以及下方的“响铃”“锁定和清空”功能,点击相应按钮即可执行相应操作。(手机发生对应反应的前提是能够通过Wi-Fi或移动数据连接正常上网,因此,如果手机离线,相关操作将会在手机上线后继续执行)。如下图:

点击响铃,手机会以最大铃声持续响5分钟。

使用了Android设备管理器的远程锁定功能,它将覆盖你手机中所有已经存在的密码,让小偷无法进入系统。清空选项则会将手机的联系人等信息删除,避免隐私的泄露。

方法二:

下载安装并确定,LBE安全大师已经开启了防盗功能。

LBE的防盗服务是独立的模块,所以用户在安装LBE后需单独下载安装“LBE放到服务”。

在主界面上滑打开完整的功能菜单,找到“手机防盗”功能,点击进入。如果您的手机已经Root,可以选择ROOT安装模式,此模式下可将LBE防盗服务作为系统组件安装,不能轻易卸载。

设置防盗密码,在您发送防盗指令或进入放到功能时需要用到。设置安全手机号码,丢失的手机在被换上别的卡时,会自动发送短信到安全手机上。(建议使用其他手机作为安全手机)

LBE包含了五大安全功能,分别为换卡通知、防盗拍照、锁定手机、手机定位、数据销毁。当你的手机丢失后,如果手机内存有敏感内容,推荐先使用数据销毁,随后再使用锁定和定位功能。如果已经Root,在软件请求权限时请允许。

注意事项:

至少需要移动网络或Wi-Fi网络中的一项网络链接,并且遗失的手机保持开机和SIM卡正常服务状态下,才能完成定位。当执行备份、定位等操作时,软件会自动打开网络连接和GPS定位。

如何才能定位安卓手机的精准位

若手机/平板电脑需要使用定位服务,建议参考以下方法:

1.双指下拉机器顶帘,开启GPS定位功能(若不使用时,建议关闭)。

2.打开设定-更多-定位服务/位置服务/位置-访问的我的位置-滑动开关(允许应用程序使用位置信息)-可以根据选项进行勾选。

  • 评论列表:
  •  访客
     发布于 2022-08-14 05:33:43  回复该评论
  • R, 3000, 0, networkListener);locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, gpsListener);}以上的代码还

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright Your WebSite.Some Rights Reserved.