0

Я разрабатываю приложение, в котором GPS требуется для обнаружения текущего местоположения пользователя и продолжения. Итак, я использую этот код: isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);, чтобы определить, включен ли GPS, и попросить пользователя включить его, если он выключен. Этот код отлично обнаруживает, если он выключен, но когда я включаю GPS ON и пытаюсь продолжить. Вышеприведенный код не обнаруживает, что GPS включен и снова запрашивает пользователя, чтобы включить GPS, даже когда он включен.Почему 'locationManager.isProviderEnabled (LocationManager.GPS_PROVIDER);' не может определить, включен ли GPS или нет в зефире андроида?

Вот как я пытаюсь идти дальше после включения GPS:

public void btnRetryGpsEvents() { 

     if (isGPSEnabled) { 
      ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getBaseContext()); 
      locationProvider.getLastKnownLocation() 
        .subscribe(new Action1<Location>() { 
         @Override 
         public void call(Location location) { 
          currentLatDouble = location.getLatitude(); 
          currentLngDouble = location.getLongitude(); 

         } 
        }); 

      Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        if (currentLatDouble != null || currentLngDouble != null) { 
          retrieveHWrapper(); 
          btnRetryGps.setVisibility(View.INVISIBLE); 
          gps_off.setVisibility(View.INVISIBLE); 
          Toast.makeText(getBaseContext(), "Loading h-requests...", Toast.LENGTH_LONG).show(); 
         } else { 
          gps_off.setVisibility(View.VISIBLE); 
          progressBarLoadingRequests.setVisibility(View.INVISIBLE); 
          btnRetryGps.setVisibility(View.VISIBLE); 
          btnRetryGps.setOnClickListener(new View.OnClickListener() { 
           @Override 
           public void onClick(View view) { 
            btnRetryGpsEvents(); 
           } 
          }); 
         } 
       } 
      }, 2000); 
     } else { 
      AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); 

      // Setting Dialog Title 
      alertDialog.setTitle("GPS settings"); 

      // Setting Dialog Message 
      alertDialog.setMessage("GPS is not enabled. Enable it in settings menu."); 

      // On pressing Settings button 
      alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
        startActivity(intent); 
       } 
      }); 

      // on pressing cancel button 
      alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.cancel(); 
       } 
      }); 

      // Showing Alert Message 
      alertDialog.show(); 

      gps_off.setVisibility(View.VISIBLE); 
      progressBarLoadingRequests.setVisibility(View.INVISIBLE); 
      btnRetryGps.setVisibility(View.VISIBLE); 
      btnRetryGps.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        btnRetryGpsEvents(); 
       } 
      }); 
     } 
    } 

Я уже попросил разрешения в OnCreate() метод:

int hasWriteContactsPermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) & ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_SETTINGS); 
     if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getBaseContext(), Manifest.permission.WRITE_SETTINGS) != 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. 
       if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) && !ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_SETTINGS)) { 
        showMessageOKCancel("You need to allow access to few permissions so that the app can work as expected.", 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_SETTINGS}, 
              REQUEST_RUNTIME_PERMISSION); 
           } 
          }); 
        return; 
       } 
       ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_SETTINGS}, 
         REQUEST_RUNTIME_PERMISSION); 
       return; 
      } 
     } 

Итак, BottomLine заключается в том, что даже после включения GPS ON и нажатия кнопки «RETRY» код, который должен быть выполнен, когда GPS включен, не выполняется!

Что здесь не так?

Пожалуйста, дайте мне знать.

ответ

1

Возможно, ваш логический объект все еще возвращает false, потому что вы не выполнили повторный выбор. Это можно сделать, заменив условие в вашей функции повтора isGPSEnabled, которое, как я полагаю, по-прежнему возвращает true. Сделайте это нравится:

public void btnRetryGpsEvents() { 

    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
     ReactiveLocationProvider locationProvider = new ReactiveLocationProvider(getBaseContext()); 
     locationProvid//... REST OF YOUR CODE ...// 

Кстати, вы должны знать, что isProviderEnabled флага будет возвращать только истинное некоторое время после включения GPS и не сразу. Это связано с тем, что устройство все еще должно иметь подключение к спутникам GPS или сетям, чтобы оно указывало, что поставщик включен. Поэтому рекомендуется проверять и повторно проверять доступность услуг после включения GPS устройства до тех пор, пока вы не получите соединение. Кроме того, я использую это для первоначальной проверки:

LocationManager locationManager; 
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
if (!locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
    // TODO Execute code if provider is not available. Also check for network connection 
} 
+0

да .. право! Замена 'isGPSEnabled' на' locationManager.isProviderEnabled (LocationManager.GPS_PROVIDER) 'выполнила эту работу для меня. :) –

+1

@ Хаммад Отлично! Сделал некоторые изменения, добавил информацию, которая может быть полезна для вас позже. Ура! – leonapse