Android6.0获取GPS定位和获取位置权限和位置信息

1.添加权限--6.0之后要动态获取,下面会说

android:name= "android.permission.ACCESS_FINE_LOCATION"/>
2.直接上代码,不多说,代码中注释很详细。

private static final int BAIDU_READ_PHONE_STATE = 100;//定位权限请求
private static final int PRIVATE_CODE = 1315;//开启GPS权限

/**
 * 检测GPS、位置权限是否开启
 */
public void showGPSContacts() {
    lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE);
    boolean ok = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (ok) {//开了定位服务
        if (Build.VERSION.SDK_INT >= 23) { //判断是否为android6.0系统版本,如果是,需要动态添加权限
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                    != PERMISSION_GRANTED) {// 没有权限,申请权限。
                ActivityCompat.requestPermissions(this, LOCATIONGPS,
                        BAIDU_READ_PHONE_STATE);
            } else {
                getLocation();//getLocation为定位方法
            }
        } else {
            getLocation();//getLocation为定位方法
        }
    } else {
        Toast.makeText(this, "系统检测到未开启GPS定位服务,请开启", Toast.LENGTH_SHORT).show();
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivityForResult(intent, PRIVATE_CODE);
    }
}

/**
 * 获取具体位置的经纬度
 */
private void getLocation() {
    // 获取位置管理服务
    LocationManager locationManager;
    String serviceName = Context.LOCATION_SERVICE;
    locationManager = (LocationManager) this.getSystemService(serviceName);
    // 查找到服务信息
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // 高精度
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW); // 低功耗
    String provider = locationManager.getBestProvider(criteria, true); // 获取GPS信息
    /**这段代码不需要深究,是locationManager.getLastKnownLocation(provider)自动生成的,不加会出错**/
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }
    Location location = locationManager.getLastKnownLocation(provider); // 通过GPS获取位置
    updateLocation(location);
}

/**
 * 获取到当前位置的经纬度
 * @param location
 */
private void updateLocation(Location location) {
    if (location != null) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        LogUtil.e("维度:" + latitude + "\n经度" + longitude);
    } else {
        LogUtil.e("无法获取到位置信息");
    }
}
/**
 * Android6.0申请权限的回调方法
 */
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        // requestCode即所声明的权限获取码,在checkSelfPermission时传入
        case BAIDU_READ_PHONE_STATE:
            //如果用户取消,permissions可能为null.
            if (grantResults[0] == PERMISSION_GRANTED && grantResults.length > 0) {  //有权限
                // 获取到权限,作相应处理
                getLocation();
            } else {
                showGPSContacts();
            }
            break;
        default:
            break;
    }
}
onRequestPermissionsResult  这个方法主要是动态获取6.0权限,返回时的回调,我这里需求是获取权限之后获取到当前位置的经纬度详细信息

3.下面是当点击获取GPS定位,跳转到系统开关,ActivityResult回调,我这里做的是必须要开启GPS权限,没有开启会一直让用户开启权限,怎么决定,看具体需求

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case PRIVATE_CODE:
                showContacts();
            break;

    }
}
4.动态权限设置添加多条权限

static final String[] LOCATIONGPS = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, 
        Manifest.permission.ACCESS_FINE_LOCATION, 
        Manifest.permission.READ_PHONE_STATE};


注:代码很详细!基础知识写的不好,大佬勿喷,谢谢!

转载标明出处:https://blog.csdn.net/zheng0906/article/details/80354641


你可能感兴趣的:(Android开发)