安卓位置服务locationManager使用时候遇到的坑
2016-02-17 14:38
555 查看
我们使用下面的代码创建一个安卓服务, 用来获取手机的位置信息, 并通过sharedpreferences 保存在 config.xml文件中。
1. 我们得到的provider 总是null, 查阅资料发现, 是我们没有开权限,因而得到的总是null, 这个问题比较隐蔽, 因为一般在Activity中所需要用到的权限 如读取手机联系人, 收发短信等都是会报错的, 但是这里没有。
遇到的第二个问题是开了权限, 但是 设置的监听事件死活没有调用到, 于是, 就想直接获取位置信息, 通过getLastKnownLocation, 但是还是没有得到, 最终定位得到错误原因是, 我们用的是DDMS 模拟器, 和真机还是有差距的, 改用真机测试, 一切ok
DDMS测试location 总是null, 报错
真机结果:
总结一下, 使用安卓位置信息的功能的时候, 特别需要注意权限, 和 需要使用真机测试, 模拟器虽然安全(可以随意发送短信), 但有时候还得上真机
1. 我们得到的provider 总是null, 查阅资料发现, 是我们没有开权限,因而得到的总是null, 这个问题比较隐蔽, 因为一般在Activity中所需要用到的权限 如读取手机联系人, 收发短信等都是会报错的, 但是这里没有。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
遇到的第二个问题是开了权限, 但是 设置的监听事件死活没有调用到, 于是, 就想直接获取位置信息, 通过getLastKnownLocation, 但是还是没有得到, 最终定位得到错误原因是, 我们用的是DDMS 模拟器, 和真机还是有差距的, 改用真机测试, 一切ok
DDMS测试location 总是null, 报错
真机结果:
总结一下, 使用安卓位置信息的功能的时候, 特别需要注意权限, 和 需要使用真机测试, 模拟器虽然安全(可以随意发送短信), 但有时候还得上真机
public class LocationService extends Service { private static final String TAG = "LocationService"; private SharedPreferences sp; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); LocationManager ls = (LocationManager) getSystemService(LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); String provider = ls.getBestProvider(criteria, true); if (provider == null){ Log.d(TAG, "provider equals null"); return; } MyListener listener = new MyListener(); ls.requestLocationUpdates(provider, 0, 0, listener); Location location = ls.getLastKnownLocation(provider); if (location == null){ Log.d(TAG, "location equals null"); return; } sp = getSharedPreferences("config", Context.MODE_PRIVATE); saveLocation(location); Log.d(TAG, "locationService"); } public void saveLocation(Location location){ double longitude = location.getLongitude(); double altitude = location.getLatitude(); float accuracy = location.getAccuracy(); String pos = "j:" + longitude + "\tw:" + altitude + "\ta:" + accuracy + "\n"; Editor edit = sp.edit(); edit.putString("location", pos); edit.commit(); Log.d(TAG, pos); } private class MyListener implements LocationListener{ private static final String TAG = "LocationService"; @Override public void onLocationChanged(Location location) { // TODO Auto-generated method stub saveLocation(location); Log.d(TAG, "onLocationChanged"); } @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 } } }
相关文章推荐
- gcc优化等级-O0 -O1 -O2 -Os -O3
- 深度解析Linux根文件系统的挂载过程
- 入门
- iOS之数组的排序(升序、降序及乱序)
- 以libevent网络库为引:网络通信和多线程
- 5.6中使用字符串存放时间,导致隐式转换发生的记录
- Dynamic AX 快捷键
- UIImagePickerController使用小结
- 轻松解决Win7与IE8浏览器不兼容的问题
- angularJs自定义指令
- Ubuntu 14.04 文件服务器--samba的安装和配置
- UIView的bounds和frame学习
- 互联网时代人力资源管理者的四大功能
- MapReduce 单词统计编程
- 此证书的签发者无效Missing iOS Distribution signing identity问题解决
- 我的架构经验小结(二)-- 关于三层架构
- STM32芯片之PWM功能配置
- android 向serverGet和Post请求的两种方式,android向server发送文件,自己组装协议和借助第三方开源
- mysql cardinality 索引选择
- 循环结构-阶乘之和