Android中应用GPS和NetWork获取定位信息

在Android中定位是属于危险权限,须要在增加Mainfest.xml中增加。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

如果在Android6.0级以上零碎,须要 动静的申请权限,也能够应用封装好 权限治理库。

定位的几种形式

在Android零碎当中,给咱们提供了四种定位形式,别离是:

network

它是依附信号塔或WiFi来定位的。对应的provider字段是LocationManager.NETWORK_PROVIDER,是一种低精度,低耗电的初略定位形式。

gps

它是依附GPS来定位的。对应的provider字段是LocationManager.GPS_PROVIDER,是高精度,高耗电的精准定位形式。

passive

被动的获取定位信息,通过承受其余APP或service的定位信息。不过须要这个权限ACCESS_FINE_LOCATION。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
fused

Google曾经将这个定位形式hide了。

获取定位的api封装

public class LocationUtils {    private static final long REFRESH_TIME = 5000L;    private static final float METER_POSITION = 0.0f;    private static ILocationListener mLocationListener;    private static LocationListener listener = new MyLocationListener();    private static class MyLocationListener implements LocationListener {        @Override        public void onLocationChanged(Location location) {//定位扭转监听            if (mLocationListener != null) {                mLocationListener.onSuccessLocation(location);            }        }        @Override        public void onStatusChanged(String provider, int status, Bundle extras) {//定位状态监听        }        @Override        public void onProviderEnabled(String provider) {//定位状态可用监听        }        @Override        public void onProviderDisabled(String provider) {//定位状态不可用监听        }    }    /**     * GPS获取定位形式     */    public static Location getGPSLocation(@NonNull Context context) {        Location location = null;        LocationManager manager = getLocationManager(context);        //高版本的权限查看        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return null;        }        if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {//是否反对GPS定位            //获取最初的GPS定位信息,如果是第一次关上,个别会拿不到定位信息,个别能够申请监听,在无效的工夫范畴能够获取定位信息            location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);        }        return location;    }    /**     * network获取定位形式     */    public static Location getNetWorkLocation(Context context) {        Location location = null;        LocationManager manager = getLocationManager(context);        //高版本的权限查看        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return null;        }        if (manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {//是否反对Network定位            //获取最初的network定位信息            location = manager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);        }        return location;    }    /**     * 获取最好的定位形式     */    public static Location getBestLocation(Context context, Criteria criteria) {        Location location;        LocationManager manager = getLocationManager(context);        if (criteria == null) {            criteria = new Criteria();        }        String provider = manager.getBestProvider(criteria, true);        if (TextUtils.isEmpty(provider)) {            //如果找不到最适宜的定位,应用network定位            location = getNetWorkLocation(context);        } else {            //高版本的权限查看            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED                    && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {                return null;            }            //获取最适宜的定位形式的最初的定位权限            location = manager.getLastKnownLocation(provider);        }        return location;    }    /**     * 定位监听     */    public static void addLocationListener(Context context, String provider, ILocationListener locationListener) {        addLocationListener(context, provider, REFRESH_TIME, METER_POSITION, locationListener);    }    /**     * 定位监听     */    public static void addLocationListener(Context context, String provider, long time, float meter, ILocationListener locationListener) {        if (locationListener != null) {            mLocationListener = locationListener;        }        if (listener == null) {            listener = new MyLocationListener();        }        LocationManager manager = getLocationManager(context);        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED                && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {            return;        }        manager.requestLocationUpdates(provider, time, meter, listener);    }    /**     * 勾销定位监听     */    public static void unRegisterListener(Context context) {        if (listener != null) {            LocationManager manager = getLocationManager(context);            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED                    && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {                return;            }            //移除定位监听            manager.removeUpdates(listener);        }    }    private static LocationManager getLocationManager(@NonNull Context context) {        return (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);    }    /**     * 自定义接口     */    public interface ILocationListener {        void onSuccessLocation(Location location);    }}

获取定位应用实例

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private boolean flag;    private Button gsp_btn;    private Button network_btn;    private Button best_btn;    private static Context context;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        context = getApplicationContext();        initView();        initListener();    }    private void initListener() {        gsp_btn.setOnClickListener(this);        network_btn.setOnClickListener(this);        best_btn.setOnClickListener(this);    }    @Override    protected void onResume() {        super.onResume();        initPermission();//针对6.0以上版本做权限适配    }    private void initView() {        gsp_btn = (Button) findViewById(R.id.gps);        network_btn = (Button) findViewById(R.id.net);        best_btn = (Button) findViewById(R.id.best);    }    private void initPermission() {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {            //查看权限            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED                    || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {                //申请权限                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 1);            } else {                flag = true;            }        } else {            flag = true;        }    }    /**     * 权限的后果回调函数     */    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == 1) {            flag = grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED;        }    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.gps:                if (flag) {                    getGPSLocation();                } else {                    Toast.makeText(this, "no permission", Toast.LENGTH_SHORT).show();                }                break;            case R.id.net:                if (flag) {                    getNetworkLocation();                } else {                    Toast.makeText(this, "no permission", Toast.LENGTH_SHORT).show();                }                break;            case R.id.best:                if (flag) {                    getBestLocation();                } else {                    Toast.makeText(this, "no permission", Toast.LENGTH_SHORT).show();                }                break;        }    }    /**     * 通过GPS获取定位信息     */    public void getGPSLocation() {        Location gps = LocationUtils.getGPSLocation(this);        if (gps == null) {            //设置定位监听,因为GPS定位,第一次进来可能获取不到,通过设置监听,能够在无效的工夫范畴内获取定位信息            LocationUtils.addLocationListener(context, LocationManager.GPS_PROVIDER, new LocationUtils.ILocationListener() {                @Override                public void onSuccessLocation(Location location) {                    if (location != null) {                        Toast.makeText(MainActivity.this, "gps onSuccessLocation location:  lat==" + location.getLatitude() + "     lng==" + location.getLongitude(), Toast.LENGTH_SHORT).show();                    } else {                        Toast.makeText(MainActivity.this, "gps location is null", Toast.LENGTH_SHORT).show();                    }                }            });        } else {            Toast.makeText(this, "gps location: lat==" + gps.getLatitude() + "  lng==" + gps.getLongitude(), Toast.LENGTH_SHORT).show();        }    }    /**     * 通过网络等获取定位信息     */    private void getNetworkLocation() {        Location net = LocationUtils.getNetWorkLocation(this);        if (net == null) {            Toast.makeText(this, "net location is null", Toast.LENGTH_SHORT).show();        } else {            Toast.makeText(this, "network location: lat==" + net.getLatitude() + "  lng==" + net.getLongitude(), Toast.LENGTH_SHORT).show();        }    }    /**     * 采纳最好的形式获取定位信息     */    private void getBestLocation() {        Criteria c = new Criteria();//Criteria类是设置定位的规范信息(零碎会依据你的要求,匹配最适宜你的定位供应商),一个定位的辅助信息的类        c.setPowerRequirement(Criteria.POWER_LOW);//设置低耗电        c.setAltitudeRequired(true);//设置须要海拔        c.setBearingAccuracy(Criteria.ACCURACY_COARSE);//设置COARSE精度规范        c.setAccuracy(Criteria.ACCURACY_LOW);//设置低精度        //... Criteria 还有其余属性,就不一一介绍了        Location best = LocationUtils.getBestLocation(this, c);        if (best == null) {            Toast.makeText(this, " best location is null", Toast.LENGTH_SHORT).show();        } else {            Toast.makeText(this, "best location: lat==" + best.getLatitude() + " lng==" + best.getLongitude(), Toast.LENGTH_SHORT).show();        }    }}

对于GPS定位的信息还有比拟多的内容,在API24中GpsStauts类过期,应用GnssStatus类替换,同时在LocationManager中的一些GPS状态的监听,也被新的API退换。