我们使用下面的代码创建一个安卓服务, 用来获取手机的位置信息, 并通过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
}
}
}