2015-10-25 11 views
10

Ich versuche, eine Anwendung zu erstellen, die Standortaktualisierungen eines Benutzers alle fünf Minuten sendet. Ich nehme an, dass mein Code gut funktioniert, aber ich bekomme einen Fehler bezüglich der Berechtigungen, die von der Anwendung verwendet werden. Ich bin mir ziemlich sicher, dass ich die Berechtigungen in der Manifestdatei hinzugefügt habe. Kann mir jemand sagen, was los ist? Hier ist mein Code.Aufruf erfordert Berechtigungen, die vom Benutzer möglicherweise abgelehnt werden

MainActivity.java

LocationManager locationManager ; 
String provider; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Getting LocationManager object 
    locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

    // Creating an empty criteria object 
    Criteria criteria = new Criteria(); 

    // Getting the name of the provider that meets the criteria 
    provider = locationManager.getBestProvider(criteria, false); 

    if(provider!=null && !provider.equals("")){ 

     // Get the location from the given provider 
     Location location = locationManager.getLastKnownLocation(provider); 
     locationManager.requestLocationUpdates(provider,5*60*1000,0,this); 

     if(location!=null) 
      onLocationChanged(location); 
     else 
      Toast.makeText(getBaseContext(), "Location can't be retrieved", Toast.LENGTH_SHORT).show(); 

    }else{ 
     Toast.makeText(getBaseContext(), "No Provider Found", Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public void onLocationChanged(Location location) { 
    // Getting reference to TextView tv_longitude 
    TextView tvLongitude = (TextView)findViewById(R.id.tv_longitude); 

    // Getting reference to TextView tv_latitude 
    TextView tvLatitude = (TextView)findViewById(R.id.tv_latitude); 

    // Setting Current Longitude 
    tvLongitude.setText("Longitude:" + location.getLongitude()); 

    // Setting Current Latitude 
    tvLatitude.setText("Latitude:" + location.getLatitude()); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 
} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 
} 

}

Ich erhalte eine Fehlermeldung als Anruf Genehmigung erfordert, die vom Benutzer zurückgewiesen werden kann in dieser Lines-

Location location = locationManager.getLastKnownLocation(provider); 
     locationManager.requestLocationUpdates(provider,5*60*1000,0,this); 

Mein AndroidManifest ist wie thi s

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.INTERNET"/> 

<application 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/title_activity_main" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

Antwort

25

Welche SDK verwenden Sie? Wenn Sie Marshmallow verwenden, müssen Sie überprüfen, ob der Benutzer für jeden Standortaufruf die Berechtigung erteilt hat.

Werfen Sie einen Blick Here.

Sie sollten dies so etwas wie tun:

if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

      ActivityCompat.requestPermissions(this, new String[] { android.Manifest.permission.ACCESS_COARSE_LOCATION }, 
               LocationService.MY_PERMISSION_ACCESS_COURSE_LOCATION); 
     } 

um Erlaubnis bitten, wenn Sie es nicht bereits getan haben.

Überprüfen Sie den Link oben für weitere Informationen.

+0

auffordern kann ich Android 4.2 verwenden und höher. –

+1

Sie müssen mit SDK 23 kompilieren, gibt es keine andere Erklärung.überprüfen Sie bitte, dass in Ihrer App Graddle-Datei – Shahar

+0

Ja, Sie hatten Recht! Es wurde mit SDK 23 kompiliert. Danke, das hat das Problem gelöst. –

13

Versuchen Sie meinen Code:

public class MainActivity extends AppCompatActivity { 

    /* GPS Constant Permission */ 
    private static final int MY_PERMISSION_ACCESS_COARSE_LOCATION = 11; 
    private static final int MY_PERMISSION_ACCESS_FINE_LOCATION = 12; 

    /* Position */ 
    private static final int MINIMUM_TIME = 10000; // 10s 
    private static final int MINIMUM_DISTANCE = 50; // 50m 

    /* GPS */ 
    private String mProviderName; 
    private LocationManager mLocationManager; 
    private LocationListener mLocationListener; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 

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

     // Get the best provider between gps, network and passive 
     Criteria criteria = new Criteria(); 
     mProviderName = mLocationManager.getBestProvider(criteria, true); 

     // API 23: we have to check if ACCESS_FINE_LOCATION and/or ACCESS_COARSE_LOCATION permission are granted 
     if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
       || ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 

      // No one provider activated: prompt GPS 
      if (mProviderName == null || mProviderName.equals("")) { 
       startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); 
      } 

      // At least one provider activated. Get the coordinates 
      switch (mProviderName) { 
       case "passive": 
        mLocationManager.requestLocationUpdates(mProviderName, MINIMUM_TIME, MINIMUM_DISTANCE, this); 
        Location location = mLocationManager.getLastKnownLocation(mProviderName); 
        break; 

       case "network": 
        break; 

       case "gps": 
        break; 

      } 

     // One or both permissions are denied. 
     } else { 

      // The ACCESS_COARSE_LOCATION is denied, then I request it and manage the result in 
      // onRequestPermissionsResult() using the constant MY_PERMISSION_ACCESS_FINE_LOCATION 
      if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
         MY_PERMISSION_ACCESS_COARSE_LOCATION); 
      } 
      // The ACCESS_FINE_LOCATION is denied, then I request it and manage the result in 
      // onRequestPermissionsResult() using the constant MY_PERMISSION_ACCESS_FINE_LOCATION 
      if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(this, 
         new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, 
         MY_PERMISSION_ACCESS_FINE_LOCATION); 
      } 

     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case MY_PERMISSION_ACCESS_COARSE_LOCATION: { 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // permission was granted 
       } else { 
        // permission denied 
       } 
       break; 

      case MY_PERMISSION_ACCESS_FINE_LOCATION: { 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        // permission was granted 
       } else { 
        // permission denied 
       } 
       break; 
      } 

     } 
    } 
} 

Quelle: LINK

+1

Sie könnten 'requestPermission' nur einmal die beiden Berechtigungen innerhalb des Arrays übergeben, –

+0

@ ThiagoPorciúncula Ich werde versuchen :) Vielen Dank für Ihren Vorschlag – eldivino87

+1

Es kann eigentlich keinen Unterschied machen, da [Berechtigungsgruppen] (http: // Entwickler .android.com/intl/pt-br/guide/topics/sicherheit/permissions.html # perm-gruppen). Wenn Sie die Berechtigung für 'ACCESS_FINE_LOCATION' erhalten, erhalten Sie automatisch 'ACCESS_COARSE_LOCATION', da sie zur selben Gruppe gehören ('LOCATION'). Sehen Sie mehr darüber hier: http://developer.android.com/intl/pt-br/training/permissions/requesting.html –

4

Dieser arbeitete für mich

if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.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. 
     Toast.makeText(YourService.this, "First enable LOCATION ACCESS in settings.", Toast.LENGTH_LONG).show(); 
     return; 
    } 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 1, listener); 
+1

Das ist richtig, aus irgendeinem Grund wirft Android Studio einen Fehler, wenn Sie nicht genau das setzen Code beim Anfordern des Standorts, auch wenn Sie die Berechtigungen auf andere benutzerdefinierte Weise verwalten. – Sca09

2

Hier sind die paar Schritte, die Sie ausführen müssen, um diese

zu beheben Hauptaktivität .java

if (ContextCompat.checkSelfPermission(this, 
android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
|| ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) 
== PackageManager.PERMISSION_GRANTED) {   
locationManager.requestLocationUpdates 
(locationManager.requestLocationUpdates(provider,5*60*1000,0,this); 
}//end of if 

Jetzt müssen Sie auch Ihre build.gradle

dependencies{ 
------------- //your pre-generated code 
compile 'com.android.support:support-v4:23.0.1' 
} 

this ist, was Android.Developers darüber sagen aktualisieren.

Und vergessen Sie nicht Berechtigungen von Anwendungseinstellungenzu geben, wenn Sie einen Emulator verwenden, weil es nicht für solche