简体   繁体   English

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

[英]Locator not working on Android 6.0 +

I have a problem with Locator in my app. 我的应用程序中的定位器出现问题。 I have service that use User current location and based on it it show pins from closest marketplaces. 我有使用“用户当前位置”的服务,并根据该位置显示最近市场的销钉。 It works without problems on Android bellows 6.0 but on 6.0 it can't get user locations. 在Android波纹管6.0上,它可以正常工作,但在6.0上,它无法获取用户位置。 I assume because of new permission system in it. 我想是因为其中有新的权限系统。

  @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;
}

How should I give user choice to grant permission for app? 我应该如何让用户选择授予应用程序权限?

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 完整文件

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM