1、关于Android系统中不同的定位模式

Android系统中包括3中定位模式:

  使用GPS、WLAN和移动网络 使用WLAN和移动网络 仅使用GPS
截图
特点

同时使用GPS、WIFI及基站定位,速度快、精度高,室内定位效果好。

缺点:耗流量、耗电量

只使用WIFI和基站定位,需要WIFI或者基站才行,室内效果好。

缺点:依赖WIFI或基站,精度一般

不依赖WIFI和基站,室内效果差,户外可靠性好。

缺点:室内效果差

代码
LocationManager.GPS_PROVIDER = true;LocationManager.NETWORK_PROVIDER = true;
LocationManager.GPS_PROVIDER = false;LocationManager.NETWORK_PROVIDER = true;
LocationManager.GPS_PROVIDER = true;LocationManager.NETWORK_PROVIDER = false;
是否打开定位服务
Settings.Secure.LOCATION_MODE = 3
Settings.Secure.LOCATION_MODE = 2
Settings.Secure.LOCATION_MODE = 1

注:上面的“代码”指的是执行结果,代码如下:

1 Log.e("David", "GPS是否打开 " + locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER));2 Log.e("David", "网络定位是否打开 " + locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER));

2、判断用户是否打开系统定位服务

方法一:

下面的代码,在API大于等于19时,返回的locationMode与用户的选择息息相关,如上图。

当定位服务关闭时,Settings.Secure.LOCATION_MODE = 0;

复制代码
 1 public boolean isLocationEnabled() { 2     int locationMode = 0; 3     String locationProviders; 4     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 5         try { 6             locationMode = Settings.Secure.getInt(getContentResolver(), Settings.Secure.LOCATION_MODE); 7         } catch (Settings.SettingNotFoundException e) { 8             e.printStackTrace(); 9             return false;10         }11         return locationMode != Settings.Secure.LOCATION_MODE_OFF;12     } else {13         locationProviders = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);14         return !TextUtils.isEmpty(locationProviders);15     }16 }
复制代码

方法二:

使用locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)和locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER),

有任何一个返回true,则可说明系统定位服务是开启的。

3、判断APP是否获得定位权限

方法一:

使用如下代码可判断当前APP是否获得定位权限,二者获得其一即可认为获得定位权限

1 checkPermissionGranted(Manifest.permission.ACCESS_FINE_LOCATION)2 checkPermissionGranted(Manifest.permission.ACCESS_COARSE_LOCATION)3 private boolean checkPermissionGranted(String permission) {4     return this.checkPermission(permission, Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_GRANTED;5 }

方法二:

在API>=23的Android系统中,可以使用ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 

方法三:

1 PackageManager pkgMgr = getPackageManager();2 return pkgMgr.checkPermission(permission, getPackageName()) == PackageManager.PERMISSION_GRANTED;

要注意的是,方法一和三在应用targetSdkVerison<23时,固定返回true,无论应用是否获得授权。如果要在API<23时正常使用,建议使用如下方法四;

方法四:

使用系统提供的方法: 

1 PermissionChecker.checkPermission(this, permission, Process.myPid(), Process.myUid(), getPackageName()) == PackageManager.PERMISSION_GRANTED;

这个方法在23前后都可以使用,但是最好是做版本判断,大于等于23时使用ActivityCompat.checkSelfPermission(),其他的使用方法四。

4、跳转到系统定位服务设置页面

1 PermissionChecker.checkPermission(this, permission, Process.myPid(), Process.myUid(), getPackageName()) == PackageManager.PERMISSION_GRANTED;

感谢http://www.cnblogs.com/wlrhnh/p/7389930.html


更多相关文章

  1. Unity调用Android原生Java代码以及Unity打开Android原生Activity
  2. 告别Dagger2模板代码:DaggerAndroid原理解析
  3. 获取Android的Java源代码并在Eclipse中关联查看
  4. 〖Android〗简单隐藏Android虚拟键盘的方法

随机推荐

  1. Android中widget组件的开发流程
  2. Android(安卓)Drawable Resource学习(一)、
  3. android开发1:安卓开发环境搭建(eclipse+j
  4. 硬件加速与软件加速
  5. 如何测试APK是否设置android:debuggable=
  6. Android(安卓)Intent的详细解析以及用法
  7. TextView 最多显示2行,每行最多8个字,多余
  8. Android手动显示和隐藏软键盘方法总结
  9. android的adb详解(多设备时adb调用)
  10. Android(安卓)Studio官方文档之Android(