[mobilesafe] 16_手机防盗的功能实现2-GPS定位

Android 4.0

GPS定位

几种定位的方式1、基站定位:当前位置离附近的基站,来进行定位
    a) 对于基站多的地方,地位精确
    b) 对于基站稀少的山沟里,定位不精准
2、网络定位:根据ip来定位
    缺点:动态ip定位不准
     google纵横(google latitude)
3、GPS定位:利用卫星定位-3颗卫星(美国)
    缺点:头顶必须是空旷
权限:
a) 一个粗略的定位权限
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>  
b) 一个精确的定位权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  
c) 模拟器模拟权限
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>

d) 可能需要访问网络权限
<uses-permission android:name="android.permission.INTERNET"/>
1、获取可用的位置提供者 
// 1、通过系统服务获取一个位置管理者
        lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        List<String> allProviders = lm.getAllProviders();
        for (String provider : allProviders) {
            System.out.println("可用的位置提供者:" + provider);
        } 
a) 模拟器

b) 小米1S

2、利用GPS进行定位
package cn.zengfansheng.phonelocation;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {

    private LocationManager lm;
    private MyLocationListener listener;
    private TextView tv_phone_location;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_phone_location = (TextView) this.findViewById(R.id.tv_phone_location);

        // 1、通过系统服务获取一个位置管理者
        lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        /*List<String> allProviders = lm.getAllProviders();
          for (String provider : allProviders) {
            System.out.println("可用的位置提供者:" + provider);
        }*/


        // 2、根据选择条件选择一个最适合的位置提供者
        Criteria criteria = new Criteria();// 相当于一个Map,criteria 条件
        criteria.setAccuracy(Criteria.ACCURACY_FINE);// 1、设置精度
        criteria.setAltitudeRequired(true);// 2、是否海拔,只能是GPS
        // criteria.setBearingAccuracy(Criteria.ACCURACY_COARSE);//精度一般
        // criteria.setBearingAccuracy(Criteria.ACCURACY_FINE);// 需要API9,高精度
        criteria.setCostAllowed(true);// 3、是否花费,网络定位需要
        criteria.setPowerRequirement(Criteria.POWER_HIGH);// 4、花费大量电
        // criteria.setSpeedAccuracy(Criteria.ACCURACY_HIGH);// 高精度
        String bestProvider = lm.getBestProvider(criteria, true);

        listener = new MyLocationListener();
        lm.requestLocationUpdates(bestProvider, 0, 0, listener);// 0,0表示自动更新
        // lm.requestLocationUpdates(provider, minTime, minDistance, listener)
        // 提供者,多长时间更新一次(毫秒),多长的距离更新一次,监听器
    }

    /**
     * 位置监听器,监听位置提供者的状态变化和位置的改变
     * 
     * @author hacket
     */

    private class MyLocationListener implements LocationListener {

        private static final String TAG = "MainActivity";

        // 3、最重要的方法:位置改变了
        @Override
        public void onLocationChanged(Location location) {
            String locationString = "位置提供者:" + location.getProvider() + "\n经度:"
                    + location.getLongitude() + "\n纬度:"
                    + location.getLatitude() + "\n精确度:"
                    + location.getAccuracy() + "\n海拔:" + location.getAltitude()
                    + "\n速度:" + location.getSpeed();
            tv_phone_location.setText(locationString);
            Log.i(TAG, locationString);
        }

        // 1、2的综合,位置提供者状态改变
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        // 2、位置提供者可用
        @Override
        public void onProviderEnabled(String provider) {
        }

        // 1、位置提供者不可用
        @Override
        public void onProviderDisabled(String provider) {
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // activity销毁时,移除
        lm.removeUpdates(listener);
        lm = null;
    }
}

结果: