您的位置:首页 > 其它

安卓位置服务locationManager使用时候遇到的坑

2016-02-17 14:38 555 查看
我们使用下面的代码创建一个安卓服务, 用来获取手机的位置信息, 并通过sharedpreferences 保存在 config.xml文件中。

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

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: