0

Ich schreibe einen Code zum Abrufen des letzten Knownlocations vom Standortmanager, und dies veranlasste mich, Laufzeitberechtigungen hinzuzufügen.Hinzufügen von Standortberechtigungen für Marshmallow

Hier ist mein Code:

public class MainActivity extends AppCompatActivity implements LocationListener { 

    LocationManager locationManager; 
    String provider; 
    private final int MY_PERMISSIONS_REQUEST_CODE=1; 
    Location location; 
    Boolean isPermissionGranted=false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

     provider = locationManager.getBestProvider(new Criteria(), false); 


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

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION},MY_PERMISSIONS_REQUEST_CODE); 
      } 

      // return; 
     } 

    } 

    public void getlastknownposition() 
    { 

    } 

    @Override 
    public void onLocationChanged(Location location) { 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 


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


     if(requestCode == MY_PERMISSIONS_REQUEST_CODE) 
     { 
      if(grantResults[0]==PackageManager.PERMISSION_GRANTED && grantResults[1]==PackageManager.PERMISSION_GRANTED){ 

      Toast.makeText(MainActivity.this," granted "+grantResults[0]+"granted2"+grantResults[1], Toast.LENGTH_SHORT).show(); 


      location = locationManager.getLastKnownLocation(provider);} 

     } 

    } 

} 

ich noch einen Fehler „Ruf erfordert Erlaubnis bin immer die vom Benutzer zurückgewiesen werden kann: Code sollte prüfen, explizit, wenn die Berechtigung zur Verfügung (mit checkPermission) oder explizit behandeln ein Potential SecurityException in onRequestPermissionsResult on line Legen location = locationManager.getLastKnownLocation(provider);

+0

haben Sie versucht, diese Zeile mit einem Einwickeln 'if (ActivityCompat.checkSelfPermission' .. ich denke, die Fehlermeldung ziemlich explizit ist - nur weil Sie machen den Aufruf von innerhalb onRequestPermissionResult bedeutet nicht, dass Sie nicht überprüfen müssen.Sie könnten auch diese Zeile in eine "try/catch" wickeln - wieder ist der Fehler explizit .. Sie müssen ein potenzielles fangen SecurityException ". – trooper

+0

Sie sollten wahrscheinlich' requestPermissi ändern ons zu 'ActivityCompat.requestPermissions'. – kimbaudi

+0

Versuchen Sie es möglicherweise Arbeit sein http://stackoverflow.com/a/41221852/5488468 –

Antwort

0

einige Klammern um die zweite, wenn in onPermissionsResult =)

if(requestCode == MY_PERMISSIONS_REQUEST_CODE){ 
     if(grantResults[0]==PackageManager.PERMISSION_GRANTED && grantResults[1]==PackageManager.PERMISSION_GRANTED){ 
      Toast.makeText(MainActivity.this," granted "+grantResults[0]+"granted2"+grantResults[1], Toast.LENGTH_SHORT).show(); 

      location = locationManager.getLastKnownLocation(provider); 
     } else { 
       //TODO handle user saying NO! :) 
     } 
    } 

Tipp: Wenn Sie FINE_LOCATION anfordern, brauchen Sie nicht COARSE, es enthält es bereits.

+0

Immer noch gleichen Fehler. –

+0

Umgeben Sie es mit try/catch wie im Kommentar vorgeschlagen, dann habe ich ein Projekt überprüft, ich habe tatsächlich eine Methode aufgerufen, und diese Methode kann eine Sicherheitsausnahme auslösen. Ich kann mir keine andere Problemumgehung vorstellen. – Alqueraf

0

Ersetzen Sie die Zeile

location = locationManager.getLastKnownLocation(provider); 

mit

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
    && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
{ 
    location = locationManager.getLastKnownLocation(provider); 
} 
Verwandte Themen