一、Android 危险权限,来自官方文档的坑
Android 开发者都知道,Android 6.0 之前,权限申请只需要在 AndroidManifest.xml 文件中声明就可以。Android 6.0 开始,权限申请发生了变化,危险权限需要在应用中动态申请。
先看看 Android 官方的说明:对危险权限进行了分组,同一组中,只要有有一个权限被授权了,同组中其它权限也就默认授权了。比如,我授权应用有读存储卡的权限之后,应用也就有了写存储卡的权限。
然而问题来了,利用 GPS 获取位置信息的代码:
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED){
// request permissions
}else{
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(location != null){
double latitude = location.getLatitude();
double longitude = location.getLongitude();
}
}
}
通过官方的危险权限组,我们也能看到:Location 权限组里包含 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 两个权限,按照上面的说明,两个权限只要有一个申请授权成功,即可成功获取经纬度。然鹅,当成功申请了 ACCESS_COARSE_LOCATION 权限后,程序依然会崩,错误信息提示,需要获得 ACCESS_FINE_LOCATION 权限。
二、Spinner 的 setSelection() 方法,源于自己想当然的坑
Android 中的下拉列表控件 Spinner 有一个方法 setSelection(int position),显示第几项。此方法可能没有效果???总是显示第一项???
当在做两个 Spinner 联动时,Spinner2 依据 Spinner1 的选择填充数据,然后使用 setSelection(2) 来设置默认项。结果发现:Spinner2 显示的总是第一项,但是实际选择的确实已经是 position 2 的位置。解决方法:
旧代码:
spinner.setAdapter(adapter);
spinner.setSelection(2);
解决方案有二:
(1)
spinner.setAdapter(adapter);
spinner.setSelection(, );


