Android 手机6.0 定位权限问题

来源:互联网 发布:轩辕网络上市 编辑:程序博客网 时间:2024/06/16 13:04
 开发工具:Android studio    废话话就不说了,下面是本人在用6.0版本手机中定位的时候也出现偏差,我自己是偏到非洲那边了,后来发现原来是缺少定位权限(注释:这里的权限指的不是配置文件里面的权限,是获取6.0版本手机的定位权限,调用时会提醒你是否使用,点击允许即可),下面是我已近在6.0手机(华为 mate8)上使用过了,在activity里里面调用getPersimmions()方法即可(  前提:有权限,key,MapView组件,jar都有的情况下),并在该方法里面写上开始定位的方法,这是判断当前版本,获取权限(允许一次就可以,第二次进入既不会再次获取权限),获取权限就可调用百度地图显示 就不会再6.0手机上出现定位出错的问题
private final int SDK_PERMISSION_REQUEST = 127;   @TargetApi(23)
   /*
    *判断当前是否是6.0版本
    */
     @TargetApi(23)
    private void getPersimmions() {
        ////判断当前是否是6.0版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ArrayList<String> permissions = new ArrayList<String>();
            /***
             * 定位权限为必须权限,用户如果禁止,则每次进入都会申请
             */
            // 定位精确位置
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);

            }
            if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);

            }
            if (permissions.size() > 0) {
                requestPermissions(permissions.toArray(new String[permissions.size()]), SDK_PERMISSION_REQUEST);
            } else {//****这里写自己的定位调用***/////
                ///当权限都有时,开始定位

                getMapView();
            }
        } else {
//****这里写自己的定位调用***/////
            ///低于6.0以下,开始定位

            getMapView();
        }


    }

    @TargetApi(23)
    private boolean addPermission(ArrayList<String> permissionsList, String permission) {
        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            // 如果应用没有获得对应权限,则添加到列表中,准备批量申请
            if (shouldShowRequestPermissionRationale(permission)) {
                return true;
            } else {
                permissionsList.add(permission);
                return false;
            }

        } else {
            return true;
        }
    }

    /**
     * 请求权限后,系统会弹出请求权限的Dialog
     * 用户选择允许或需要后,会回调onRequestPermissionsResult方法, 该方法类似于onActivityResult
     */
    @TargetApi(23)
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        // TODO Auto-generated method stub
        ///权限允许后,开始定位
        getMapView();
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    }
   ///////////////////以下是百度地图代码///////////////////////////////
    private void getMapView() {
        // 设置是否显示比例尺控件
        mapView.showScaleControl(true);
        // 设置是否显示缩放控件
        mapView.showZoomControls(false);
        baiduMap = mapView.getMap();
        baiduMap.setMyLocationEnabled(true);

        baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
                locationmode, true, null));
        // 设置定位图层配置信息(跟随,罗盘,没有)
        locationmode = MyLocationConfiguration.LocationMode.NORMAL;
        // 创建定位服务的客户端
        client = new LocationClient(this);
        MyLocationListener listener = new MyLocationListener();
        client.registerLocationListener(listener);
        // 开始定位
        client.setLocOption(getDefaultLocationClientOption());
        client.start();
        startHandle();
    }

    @SuppressWarnings("deprecation")
    public LocationClientOption getDefaultLocationClientOption() {
        if (option == null) {
            option = new LocationClientOption();
            option.setOpenGps(true);
            // 修复6.0错误
            option.setPriority(LocationClientOption.GpsFirst);
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            // 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
            option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
            option.setScanSpan(1500);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
            option.setIsNeedAddress(false);// 可选,设置是否需要地址信息,默认不需要
            option.setIsNeedLocationDescribe(false);// 可选,设置是否需要地址描述
            option.setNeedDeviceDirect(true);// 可选,设置是否需要设备方向结果
            option.setLocationNotify(false);// 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
            option.setIgnoreKillProcess(false);// 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
            option.setIsNeedLocationDescribe(false);// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
            option.setIsNeedLocationPoiList(false);// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
            option.SetIgnoreCacheException(false);// 可选,默认false,设置是否收集CRASH信息,默认收集
        }
        return option;
    }

    // ////////////////获取位置监听///////////////////////
    private class MyLocationListener implements BDLocationListener {

        public void onReceiveLocation(BDLocation location) {

            if (location == null || mapView == null)
                return;
            ////获得当前的经纬度和地址
            bdlocation = location;
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    .direction(location.getDirection())
                    .latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            // 设置定位数据
            baiduMap.setMyLocationData(locData);

            if (isFirstLocation) {
                isFirstLocation = false;
                Log.i("经纬度:", "---" + location.getLatitude() + "\n"
                        + location.getLongitude());
                LatLng latLng = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatus mapStatus = new MapStatus.Builder().target(latLng)
                        .zoom(13).build();
                MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory
                        .newMapStatus(mapStatus);
                // 以动画方式更新地图状态
                baiduMap.animateMapStatus(mapStatusUpdate);
            }
        }

        @SuppressWarnings("unused")
        public void onReceivePoi(BDLocation poiLocation) {
        }

    }



以上就可读取手机权限,进行定位判断。。。。。

原创粉丝点击