定位器无法在Android 6.0 +上运行

时间:2016-06-02 09:06:51

标签: java android google-maps android-layout android-fragments

我的应用中存在Locator问题。我有使用用户当前位置的服务,并基于它显示来自最近的市场的针脚。它在Android风箱6.0上没有问题,但在6.0上它无法获得用户位置。我假设因为新的权限系统。

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


    View v = inflater.inflate(R.layout.locator_fragment, container, false);


    // Gets the MapView from the XML layout and creates it

    mapView = (MapView) v.findViewById(R.id.mapview);
    mapView.onCreate(savedInstanceState);

    // Gets to GoogleMap from the MapView and does initialization stuff
    map = mapView.getMap();
    map.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange(final Location location) {
            Latitude= location.getLatitude();
            Longitude=  location.getLongitude();
            float distance = location.distanceTo(location);
            Location locationzoom = map.getMyLocation();
            LatLng mapCenter = new LatLng(location.getLatitude(), location.getLongitude());
            if(!didSetLocation) {
                CameraPosition cameraPosition = CameraPosition.builder()
                        .target(mapCenter)
                        .zoom(13)
                        .bearing(80)
                        .build();

                map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition),
                        2000, null);
                didSetLocation=true;
            }
            if ((lastcall!=null)?(location.distanceTo(lastcall)>1000):true)
            {
                map.clear();
                NetworkSDK.getInstance().getCoordinates(Latitude, Longitude, new Callback<List<Coordinate>>() {
                    @Override
                    public void onResponse(Call<List<Coordinate>> call, Response<List<Coordinate>> response) {
                        for (int i = 0; i < response.body().size(); i++) {
                            map.addMarker(new MarkerOptions()
                                    .position(new LatLng(response.body().get(i).getLatitude(), response.body().get(i).getLongitude()))
                                    .title(response.body().get(i).getName()));

                        }
                        lastcall=location;

                    }

                    @Override
                    public void onFailure(Call<List<Coordinate>> call, Throwable t) {
                        Toast.makeText(getContext(), R.string.errorNoconnection, Toast.LENGTH_SHORT).show();

                    }
                });
            }
        }

    });

    Location mLastLocation;
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL);

    map.getUiSettings().setMyLocationButtonEnabled(false);
    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.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 v;
    }
    map.setMyLocationEnabled(true);
    map.isTrafficEnabled();

    // Needs to call MapsInitializer before doing any CameraUpdateFactory calls

    MapsInitializer.initialize(this.getActivity());

    // Updates the location and zoom of the MapView
    return v;
}

我应该如何让用户选择授予应用权限?

1 个答案:

答案 0 :(得分:1)

private static final int REQUEST_CAMERA_PERMISSION = 1;

     void checkPremission() {
            //select which permission you want
            final String permission = Manifest.permission.CAMERA;
                // if in fragment use getActivity()
            if (ContextCompat.checkSelfPermission(ActivityName.this, permission)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(ActivityName.this, permission)) {

                } else {
                    ActivityCompat.requestPermissions(ActivityName.this, new String[]{permission}, REQUEST_CAMERA_PERMISSION);
                }
            } else {
                // you have permission go ahead

            }
        }

        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode) {
                case REQUEST_CAMERA_PERMISSION:
                    final int numOfRequest = grantResults.length;
                    final boolean isGranted = numOfRequest == 1
                            && PackageManager.PERMISSION_GRANTED == grantResults[numOfRequest - 1];
                    if (isGranted) {
                        // you have permission go ahead
                    }else{
                        // you dont have permission show toast
                    }
                    break;
                default:
                    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
        }

Full Documentation