2016-11-16 5 views
0

Я показываю карту, используя представление карты, и до того, как API 23 мое приложение работает нормально и показывает текущее местоположение, но когда я запускаю 23 и выше, он не показывает текущее местоположение. Мой код выглядит следующим образом :Текущее местоположение не отображается над Api 23

mMap = googleMap; 
     mMap.getUiSettings().setMapToolbarEnabled(false); 

     LatLng loc = new LatLng(currentLatitude, currentLongitude); 
     //mMap.addMarker(new MarkerOptions().position(loc).title(currentLocation + ", none")); 
     //mMap.moveCamera(CameraUpdateFactory.newLatLng(loc)); 
     mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 14.0f)); 
     if (ActivityCompat.checkSelfPermission(MapClass.this.getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MapClass.this.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; 
     } 
     mMap.setMyLocationEnabled(true); 

Помогите мне?

ответ

0

Проверка документа о запрашивающей Permissions at Run Time говорится, что:

Начиная с Android 6.0 (уровень API 23), пользователи предоставлять разрешение приложения в то время как приложение работает, не при установке приложения. Этот подход упрощает процесс установки приложения, поскольку пользователю не нужно предоставлять разрешения при установке или обновлении приложения. Он также дает пользователю больше контроля над функциональностью приложения; например, пользователь может выбрать доступ к камере для камеры, но не к местоположению устройства. Пользователь может отменить разрешения в любое время, перейдя на экран настроек приложения.

Если устройство работает под управлением Android 6.0 или выше, и целевой SDK вашего приложения является 23 или выше: Приложение имеет в список разрешений в манифесте и он должен просить каждое опасное разрешение ему необходим в то время как приложение работает. Пользователь может разрешить или запретить каждое разрешение, и приложение может продолжать работать с ограниченными возможностями, даже если пользователь отклоняет запрос на разрешение

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
      @NonNull int[] grantResults) { 
     if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) { 
      return; 
     } 

     if (PermissionUtils.isPermissionGranted(permissions, grantResults, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 
      // Enable the my location layer if the permission has been granted. 
      enableMyLocation(); 
     } else { 
      // Display the missing permission error dialog when the fragments resume. 
      mPermissionDenied = true; 
     } 
    } 

ApiDemos repository на GitHub включает в себя образцы, демонстрирующие использование места на карта:

Надеюсь, это поможет.

+0

Благодарю г-на Ребота –

0

Возможно, я немного опоздал, но этот ответ поможет людям, которые имеют одну и ту же проблему, и хотят запустить свое приложение на обеих версиях. Уловка заключается в том, что для API более 21 требуется просить Run time permission.

Во-первых, я создал функцию с именем gettingLocationBasedOnApiVersion(mMap), в которой я поместил весь код, для которого я использовал местоположение пользователя. Но заранее, в onMapReady() я проверил версию API, и если версия API более 21, я попросил разрешения.

@Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 

     if(Build.VERSION.SDK_INT <= 21){ 
      gettingLocationBasedOnApiVersion(mMap); 
      Toast.makeText(getApplicationContext(), "APK less than 21", Toast.LENGTH_LONG).show(); 
     }else{ 
      Log.i("SDK Version", "SDK more than 21 will require permissions on run time"); 
      Toast.makeText(getApplicationContext(), "APK greater than 21", Toast.LENGTH_LONG).show(); 
      enableMyLocation(); 
     } 
    } 

Тогда в функции включения я попросил разрешения времени выполнения.

private static final int LOCATION_PERMISSION_REQUEST_CODE = 1; 
private boolean mPermissionDenied = false; 
private void enableMyLocation() { 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 
      // Permission to access the location is missing. 
      PermissionUtils.requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE, 
        Manifest.permission.ACCESS_FINE_LOCATION, true); 
     } else if (mMap != null) { 
      // Access to the location has been granted to the app. 
      mMap.setMyLocationEnabled(true); 
      gettingLocationBasedOnApiVersion(mMap); 

     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
              @NonNull int[] grantResults) { 
     if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) { 
      return; 
     } 

     if (PermissionUtils.isPermissionGranted(permissions, grantResults, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 
      // Enable the my location layer if the permission has been granted. 
      enableMyLocation(); 
     } else { 
      // Display the missing permission error dialog when the fragments resume. 
      mPermissionDenied = true; 
     } 
    } 

    @Override 
    protected void onResumeFragments() { 
     super.onResumeFragments(); 
     if (mPermissionDenied) { 
      // Permission was not granted, display error dialog. 
      showMissingPermissionError(); 
      mPermissionDenied = false; 
     } 
    } 

    /** 
    * Displays a dialog with error message explaining that the location permission is missing. 
    */ 
    private void showMissingPermissionError() { 
     PermissionUtils.PermissionDeniedDialog 
       .newInstance(true).show(getSupportFragmentManager(), "dialog"); 
    } 

Для лучшего понимания, вы можете использовать отсылаете Places Class на моей странице GitHub. PS. Не забудьте добавить класс PermissionUtils в папку app.

 Смежные вопросы

  • Нет связанных вопросов^_^