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

我们使用下面的代码创建一个安卓服务, 用来获取手机的位置信息, 并通过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"/>
  1. 遇到的第二个问题是开了权限, 但是 设置的监听事件死活没有调用到, 于是, 就想直接获取位置信息, 通过getLastKnownLocation, 但是还是没有得到, 最终定位得到错误原因是, 我们用的是DDMS 模拟器, 和真机还是有差距的, 改用真机测试, 一切ok
    DDMS测试location 总是null, 报错安卓位置服务locationManager使用时候遇到的坑_第1张图片
    真机结果:
    安卓位置服务locationManager使用时候遇到的坑_第2张图片

  2. 总结一下, 使用安卓位置信息的功能的时候, 特别需要注意权限, 和 需要使用真机测试, 模拟器虽然安全(可以随意发送短信), 但有时候还得上真机


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

        }

    }

}

你可能感兴趣的:(android)