-
2022-04-29 11:37:48
将目录此文件改为如下
frameworks\base\packages\SettingsProvider\res\values\defaults.xml
<string name="def_location_providers_allowed" translatable="false">gps,network</string>
更多相关内容 -
Android使用网络获取定位的方法
2020-08-26 00:33:53主要为大家详细介绍了Android使用网络获取定位的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Android原生定位的方法(GPS,网络定位)源码
2018-11-03 13:18:35Android开发之原生定位的方法(GPS,网络定位)更多查看我的博客:https://blog.csdn.net/xiayiye5/article/details/83686286 -
Android获取网络定位封装工具类
2018-11-30 09:41:52Android获取网络定位封装工具类,快速获取网络定位,经纬度。 -
Android网络定位或GPS定位
2017-01-17 18:34:09简单的位置定位设备位置定位的方式有两种:GPS定位和网络定位。1.GPS准确度高但耗电多,2.网络定位耗电少但准确度低。简单的位置定位
设备位置定位的方式有两种:GPS定位和网络定位。
1.GPS准确度高但耗电多,
2.网络定位耗电少但准确度低
下面介绍Android中最简单的获得手机地理位置的方法:
1.添加权限
<!-- provider的权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 仅网络定位的权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
2.获取定位管理对象
//定义数据 //定位都要通过LocationManager这个类实现 private LocationManager locationManager; private String provider; //是否为网络位置控制器或GPS定位 //当前可用的位置控制器 List<String> list; //实例化 //获取定位服务管理对象 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //获取当前可用的位置控制器 list = locationManager.getProviders(true);
3.选择GPS定位还是选择网络定位,最好选择GPS。
//检查是否打开了GPS或网络定位 if (list.contains(LocationManager.GPS_PROVIDER)) { //是否为GPS位置控制器 provider = LocationManager.GPS_PROVIDER; textView.append("GPS位置控制器" + "\n"); } else if (list.contains(LocationManager.NETWORK_PROVIDER)) { //是否为网络位置控制器 provider = LocationManager.NETWORK_PROVIDER; textView.append("网络位置控制器" + "\n"); } else { Toast.makeText(this, "请检查网络或GPS是否打开", Toast.LENGTH_LONG).show(); return; }
4.获取地理位置
Location location = locationManager.getLastKnownLocation(provider); if (location != null) { //获取当前位置,这里只用到了经纬度 String string = " 纬度为:" + location.getLatitude() + ",经度为:" + location.getLongitude(); Toast.makeText(this, string, Toast.LENGTH_SHORT).show(); textView.append(string + "\n"); }
5.绑定监听事件,如果位置改变就回调相应的方法
//绑定定位事件,监听位置是否改变 //第一个参数为控制器类型第二个参数为监听位置变化的时间间隔(单位:毫秒) //第三个参数为位置变化的间隔(单位:米)第四个参数为位置监听器 locationManager.requestLocationUpdates(provider, 2000, 2, locationListener);
执行上面的代码前还要创建一个监听对象:
LocationListener locationListener = new LocationListener() { @Override //状态改变的回调方法 public void onStatusChanged(String arg0, int arg1, Bundle arg2) { } @Override //提供者(网络或GPS)被打开的回调方法 public void onProviderEnabled(String arg0) { } @Override //提供者(网络或GPS)被关闭的回调方法 public void onProviderDisabled(String arg0) { } @Override //经纬度改变的回调方法,基本都是使用这个回调方法 public void onLocationChanged(Location arg0) { // 更新当前经纬度 // Toast.makeText(MainActivity.this, "" + arg0.toString(), Toast.LENGTH_SHORT).show(); textView.append("经度:" + arg0.getLongitude() + ",纬度:" + arg0.getLatitude() + "\n"); } };
上面就是最简单的定位的功能代码。但是实际中会报错!因为权限的请求问题!还有API的等级问题!
这里就需要多加几行代码:if (Build.VERSION.SDK_INT >= 23) { //如果用户并没有同意该权限 if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //申请权限 // requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 100); } else { //有权限直接获取地理位置 } } else {//低版本手机,直接获取位置信息 }
实际上,上面代码方法里面不写东西也是可以的,但是如果没有上面的代码,编译就不通过!
下面是一个简单请求地理位置的程序:
效果:
这里已经打开GPS定位功能了,所以默认显示的GPS定位,否则只能显示网络定位!1.添加权限
<!-- provider的权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 仅网络定位的权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
2.布局设置
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="getLocation" android:text="获取我所在的位置的经纬度" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="bandLocationListener" android:text="一直监听位置" /> <TextView android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
3.代码设计
package fuxi.location; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; import android.widget.Toast; import java.util.List; public class MainActivity extends AppCompatActivity { //定位都要通过LocationManager这个类实现 private LocationManager locationManager; private String provider; //是否为网络位置控制器 //当前可用的位置控制器 List<String> list; TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.tv); //获取定位服务 locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //获取当前可用的位置控制器 list = locationManager.getProviders(true); //检查是否打开了GPS或网络定位 if (list.contains(LocationManager.GPS_PROVIDER)) { //是否为GPS位置控制器 provider = LocationManager.GPS_PROVIDER; textView.append("GPS位置控制器" + "\n"); } else if (list.contains(LocationManager.NETWORK_PROVIDER)) { //是否为网络位置控制器 provider = LocationManager.NETWORK_PROVIDER; textView.append("网络位置控制器" + "\n"); } else { Toast.makeText(this, "请检查网络或GPS是否打开", Toast.LENGTH_LONG).show(); return; } } //获得我所在的位置的经纬度 public void getLocation(View view) { if (Build.VERSION.SDK_INT >= 23) { //如果用户并没有同意该权限 if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //申请权限 } } else {//低版本手机,直接获取位置信息 } Location location = locationManager.getLastKnownLocation(provider); if (location != null) { //获取当前位置,这里只用到了经纬度 String string = " 纬度为:" + location.getLatitude() + ",经度为:" + location.getLongitude(); Toast.makeText(this, string, Toast.LENGTH_SHORT).show(); textView.append(string + "\n"); } } //位置的监听 public void bandLocationListener(View view) { //绑定定位事件,监听位置是否改变 //第一个参数为控制器类型第二个参数为监听位置变化的时间间隔(单位:毫秒) //第三个参数为位置变化的间隔(单位:米)第四个参数为位置监听器 locationManager.requestLocationUpdates(provider, 2000, 2, locationListener); if (Build.VERSION.SDK_INT >= 23) { //如果用户并没有同意该权限 if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //申请权限 // requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 100); } else { //有权限直接获取地理位置 } } else {//低版本手机,直接获取位置信息 } } LocationListener locationListener = new LocationListener() { @Override //状态改变的回调方法 public void onStatusChanged(String arg0, int arg1, Bundle arg2) { } @Override //提供者(网络或GPS)被打开的回调方法 public void onProviderEnabled(String arg0) { } @Override //提供者(网络或GPS)被关闭的回调方法 public void onProviderDisabled(String arg0) { } @Override //经纬度改变的回调方法,基本都是使用这个回调方法 public void onLocationChanged(Location arg0) { // 更新当前经纬度 // Toast.makeText(MainActivity.this, "" + arg0.toString(), Toast.LENGTH_SHORT).show(); textView.append("经度:" + arg0.getLongitude() + ",纬度:" + arg0.getLatitude() + "\n"); } }; //关闭时解除监听器 @Override protected void onDestroy() { super.onDestroy(); if (locationManager != null) { if (Build.VERSION.SDK_INT >= 23) { //如果用户并没有同意该权限 if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { //申请权限 } } locationManager.removeUpdates(locationListener); } } }
上面程序在真机上面跑,是可以看到经纬度的实际变化的。
当然这里只是最简单的位置的请求,可以把请求的位置放到百度地图上。
但是使用百度的地图的SDK,可以很方便的请求到位置并且显示到地图上面,这个另作总结。 -
AndroidGPS和网络定位及集成天地图demo
2022-03-28 22:53:09该jar包为本人开发中使用的demo,有GPS和网络定位,还有个界面是天地图定位的demo,也可以天地图打点。 -
android 10 定位权限适配
2020-08-12 21:52:00* 判断网络定位是否打开 * * @return 定位打开结果 */ public static boolean isLocationEnable(Activity activity) { LocationManager locationManager = (LocationManager) activity.getSystemService.../** * 判断网络定位是否打开 * * @return 定位打开结果 */ public static boolean isLocationEnable(Activity activity) { LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); return gps || network; }
因为android 10 新增了在使用中允许的设定,隐私性是提高了,但是作为开发者就苦逼了,只要用户选了这个选项,以前的那些申请权限那些统统不管用,只能说让用户手动去开启权限了,
-
android demo,不适应GPS,通过网络定位到所在地的地址
2019-02-07 12:18:46android demo,通过网络定位到所在地的地址,如果是移动网络,可以定位的详细的地址,如果是wifi,只能定位到市区的地址, -
Android GPS室内定位问题的解决方法(location为null)
2020-08-31 09:06:47主要为大家详细介绍了Android GPS室内定位问题的解决方法,location为null,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
安卓定位方式全总结-gps定位,network定位,ip定位,基站定位
2021-06-02 21:27:08一般我们使用的是第三...文章目录定位方式1.gps和network(时效性差)1.1 使用条件1.1.1 需要开启位置服务:1.1.2 安卓6.0以上还需要开启位置权限android.permission.ACCESS_COARSE_LOCATION,android.permission.ACC...一般我们使用的是第三方定位,因为第三方定位比较成熟,有些场景我们不需要或者不可以使用第三方定位的时候我们就需要自己去获取定位了。
文章目录
定位方式
1.gps和network(时效性差)
1.1 使用条件
1.1.1 需要开启位置服务:
1.1.2 安卓6.0以上还需要开启位置权限android.permission.ACCESS_COARSE_LOCATION,android.permission.ACCESS_FINE_LOCATION
1.2 代码部分
1.2.1 定位工具类
1.2.2 检查定位服务
1.2.3 设置完成之后获取经纬度信息
2.IP定位(准确性差)
3.基站定位(收费)
定位方式
1.gps和network(时效性差)
1.1 使用条件
1.1.1 需要开启位置服务:
高精准度(GPS+Network)
节电(network)
仅限设备(gps)
1.1.2 安卓6.0以上还需要开启位置权限android.permission.ACCESS_COARSE_LOCATION,android.permission.ACCESS_FINE_LOCATION
1.2 代码部分
gps为卫星定位,室外定位。network室内也可以定位,但是精准度不高。在我们必须要快速获取位置信息的时候,我们加上IP定位和基站定位效果会好一些
1.2.1 定位工具类
/**
* @author 程前 on 2018/9/26.
* blog: https://blog.csdn.net/ch1406285246
* content:
* modifyNote:
*/
object LocationUtils {
var latitude = 0.0
var longitude = 0.0
/**
* 获取经纬度
*
* @param context
* @return
*/
@SuppressLint("MissingPermission")
fun getLngAndLat(context: Context): String {
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val providers = locationManager.allProviders
for (provider in providers) {
val location = locationManager.getLastKnownLocation(provider)
if (location != null) {
latitude = location.latitude
longitude = location.longitude
return "$longitude,$latitude"
}
}
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0F, locationListener)
val location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
if (location != null) {
latitude = location.latitude
longitude = location.longitude
}
return "$longitude,$latitude"
}
val locationListener = object : LocationListener {
override fun onLocationChanged(location: Location?) {
if (location != null) {
latitude = location.latitude;
longitude = location.longitude;
}
}
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {
}
override fun onProviderEnabled(provider: String?) {
}
override fun onProviderDisabled(provider: String?) {
}
};
/**
* 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的
* @param context
* @return true 表示开启
*/
fun isOPen(context: Context): Boolean {
val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
// 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快)
val gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位)
val network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (gps || network) {
return true;
}
return false;
}
}
1.2.2 检查定位服务
/**
* 检查定位服务有没有开启,没有开启就引导用户去开启定位服务
* */
private fun checkLocation() {
if (!LocationUtils.isOPen(this)) {
//没有打开则弹出对话框
//下面是个dialog,请自己写,我的封装dialog不贴出来
val tipDialog = TipDialog(this)
.setTitle("提示")
.setContent("当前应用需要打开定位功能。\n\n请点击\"设置\"-\"定位服务\"-打开定位功能。")
.setLeftBtnText("取消")
.setRightBtnText("去设置")
tipDialog.setOnBtnClickListener(object : TipDialog.OnDialogBtnClickListener {
override fun onLeftBtnClicked(paramTipDialog: TipDialog?) {
tipDialog.dismiss()
}
override fun onRightBtnClicked(paramTipDialog: TipDialog?) {
tipDialog.dismiss()
//跳转GPS设置界面
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent, GPS_REQUEST_CODE);
}
}).show()
}
}
1.2.3 设置完成之后获取经纬度信息
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == GPS_REQUEST_CODE) {
//做需要做的事情,比如再次检测是否打开GPS了 或者定位
checkLocation()
}else{
val locationStr=LocationUtils.getLngAndLat(this)
}
}
2.IP定位(准确性差)
访问API拿到IP信息,例http://pv.sohu.com/cityjson?ie=utf-8
如果你仅仅只是需要城市,那么这样做足够了,如果你还要更详细的信息,请使用IP查询地理位置信息的API。
3.基站定位(收费)
需要选用第三方的服务进行基站定位
推荐一:google官方
推荐二:聚合API
-
Android定位详解 兼容网络定位、GPS定位
2019-10-17 16:40:22Android6.0 高通上面跑 D:\AndroidStudioProjects\MyGPSTest ... 基于android的定位无非就两种:network、gps。两者各有优劣。 GPS定位的好处:精确度高;坏处:仅能在户外使用,获取...网络定位的好处:户内户外都... -
android 网络定位失败 location为null的真正原因
2021-06-05 12:18:52最近开发一个android应用,需要用到定位功能,经过网上查资料发现gps定位速度太慢,遂决定用网络定位,结果在本人的三星手机上调试发现locationManager = (LocationManager)this.getSystemService(Context.LOCATION_... -
android 6.0下webview的定位权限设置方法
2020-08-27 02:48:15今天小编就为大家分享一篇android 6.0下webview的定位权限设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
Android 10.0相关权限的变更(使用WiFi Direct必须打开定位)
2021-01-03 18:05:02最近很多厂商推送了...如果应用以 Android 10 或更高版本为目标平台,并且应用不是系统应用或 DPC,则下列方法不会返回有用数据: getConfiguredNetworks() 方法始终返回空列表。 每个返回整数值的网络操作方法 -
android使用网络定位
2012-10-22 09:19:25如果用android1.6的sdk开发的程序,会出现一个问题,手机无法自己去定位,运行就会保存,android2.2的 sdk就没问题,这时候,就可以用网络来定位 -
Android 网络定位城市获取天气
2016-01-20 17:31:54Android通过网络定位获取坐标及城市信息,通过中国天气网获取天气数据。 -
Android开发之原生定位的方法(GPS,网络定位)
2018-11-03 13:09:31addsList = geocoder.getFromLocation(latitude, longitude, 10);//得到的位置可能有多个当前只取其中一个 Log.e("打印拿到的城市", addsList.toString()); } catch (IOException e) { e.printStackTrace(); }... -
Android 10不能使用uiautomatorviewer定位元素的终极解决方法
2021-06-02 21:33:12Android app 元素定位除了使用Appium Inspector 外,还可以使用Android SDK 里tools中的uiautomatorviewer 工具。但今天打算使用 uiautomatorviewer 进行元素定位的时候,发现无法截图,并报如下错误:Unexpected ... -
Android定位与百度定位
2021-12-02 18:49:49Android定位与百度定位 AS开发作业二:LBSAndroid定位与百度定位前言一、实验内容与界面展示1. 实验内容与技术2. 界面展示二、实现过程1. 项目配置2. activity_main.xml文件的相关配置添加3. 创建DemoApplication类... -
获取当前定位(GPS+网络)
2017-08-24 16:43:42通过网络或GPS实时获取当前位置信息 -
android自带定位
2019-12-04 15:19:01Android自带定位,我封装了一下工具类,定位类型是网络定位和gps定位。以前写的那个有问题,现在更新下 -
安卓10源码开发定制(21)GPS定位研究(3)修改GPS定位数据测试gps定位代码
2021-02-05 21:18:33安卓10源码开发定制(21)GPS定位研究(3)修改GPS定位数据测试gps定位代码 文章首发微信公众号:QDROID88888,如果感兴趣可以关注一下公众号。 一、测试gps定位功能的方法探讨 在安卓App gps定位开发过程中,往往需要... -
Android 实现定位
2021-11-27 20:59:45给人们(尤其是笔者这样的路痴)带来了极大的便利,而如今大部分安卓设备,已非复吴下阿蒙,不仅仅支持过去的GPS定位,还兼容了北斗、伽利略、GLONASS等全球卫星定位系统,以及网络定位技术。本文将介绍实时经纬度,... -
android P高通平台支持google nlp定位
2020-08-26 11:52:44androiid P高通平台仅支持gps定位,此patch为使平台支持网络定位。由于需要使用google定位服务,必须在外网环境下才能定位成功,并且第一次定位时间较长。 -
基于位置指纹算法的Android平台WiFi定位系统
2020-08-14 03:43:54本文首先设计了整体的系统框架,通过研究分析了该算法目前存在的问题,提出了改进方案,并在Android平台上实现完整的定位系统。 -
android 基于GPS或网络定位学习(LocationManager)
2019-08-12 01:25:26NULL 博文链接:https://forlan.iteye.com/blog/2264514 -
Android网络定位实现
2014-03-11 00:32:391、引言 目前LBS((Location Based ...但是,他们有一个致命的确定:在室内的环境中,基本是定位不了,而且GPS定位速度是比不上网络定位的。所以,现在的LBS应用中,都是同时打开网络定位和GPS定位的。其中,网络定位