2017-07-21 1 views
-3

Ich muss die Berechtigung in Fragment zur Laufzeit überprüfen, um die Position zu erhalten. Hier ist eine Funktion zum Überprüfen der Berechtigung.Laufzeitberechtigung (requestPermissions) funktioniert nicht

public void weather() { 
    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(getActivity()); 

    try { 
     if (checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

      requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 123); 

      return; 
     } 
     mFusedLocationClient.getLastLocation() 
       .addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() { 
        @Override 
        public void onSuccess(Location location) { 

         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
          syncData(latitude, longitude); 

         } 
        } 
       }); 
     return; 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (requestCode == 123) { 
     weather(); 
    } 
} 

Das Problem ist, dass mein Code in diesem wie eine Schleife stecken. Es gewährt keine Berechtigungen, und jedes Mal, wenn dies der Fall ist, wird true und mein Code wie eine Schleife zwischen der Überschreibungsberechtigung und der if-Anweisung zurückgegeben. Und eine Sache mehr brauchen wir diese zwei permission im Manifest auch?

if (checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

     requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 123); 

     return; 
    } 
+0

Ich bin Ganz sicher nicht, können Sie versuchen, indem Sie ActivityCompat als Präfix wie Acti hinzufügen vityCompat.checkSelfPermission und ActivityCompat.requestPermissions und versuchen? – Raghavendra

+0

Es funktioniert nicht ... auf Android-Versionen niedriger als Marshmallow! –

+0

@ Raghavendra danke, aber ich arbeite in einem Fragment, indem ich Präfix es zuerst an die Elternklasse gehen.Ich denke, wir müssen das nicht tun.am richtig? –

Antwort

0

Versuchen unter Bedingung in onRequestPermissionsResult

if (requestCode == 123 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     weather(); 
    } 

Und Sie können entfernen und den Zustand der ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED, wie es mit ACCESS_FINE_LOCATION zu gleichen Berechtigungsgruppe gehört

1

Versuchen Sie, diese

@Override 
public void onRequestPermissionsResult(int requestCode, 
             @NonNull String permissions[], 
             @NonNull int[] grantResults) { 
    if (requestCode == 123) { 
     if (grantResults.length == 1 && 
       grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      weather(); 

     } else { 
      Toast.makeText(getActivity(), "Permission denied", oast.LENGTH_SHORT).show(); 
     } 
    } 
} 
Verwandte Themen