2017-05-30 6 views
1

Hallo Ich baue eine App Ich möchte auf den Standort des Mobiltelefons zugreifen. Es scheint jedoch, dass ich die Zugriffserlaubnis nicht erlauben kann, so funktioniert meine App nicht in Android M Handy, das ich gerade teste. Hier ist ein Teil meines Code:Kann FINE_LOCATION nicht erteilen Berechtigung

public class LocationMainActivity extends AppCompatActivity { 

private ListView listView; 
private static final String EXTERNAL_PERMISSIONS[] = new String[]{ 
     Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.INTERNET}; 
private static final int EXTERNAL_CODE=1; 
private boolean perm; 
private Cursor cursor; 
private DatabaseAdapt dbAdapt; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_location_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar4); 
    setSupportActionBar(toolbar); 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    listView = (ListView)findViewById(R.id.locationContainer); 

    dbAdapt = new DatabaseAdapt(this); 
    dbAdapt.open(); 
    cursor =dbAdapt.loadLocationTitles(); 
    String [] from = new String[]{DatabaseAdapt.LOCATION_TITLE}; 
    int [] to = new int[] {android.R.id.text1}; 
    CursorAdapter cursorAdapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_1,cursor, 
      from,to,0); 
    listView.setAdapter(cursorAdapter); 
} 

public void onDestroy(){ 
    super.onDestroy(); 
    cursor.close(); 
    dbAdapt.close(); 
} 

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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if(id==R.id.add_button);{ 
     askForPerm(); 
     if(perm){ 
      Intent intent = new Intent(LocationMainActivity.this,LocationSecondActivity.class); 
      startActivity(intent); 
     } 
     else { 
      askForPerm(); 
     } 
    } 
    return super.onOptionsItemSelected(item); 
} 

private void askForPerm() { 

    // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    int w = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
    int r = ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET); 

    if (w != PackageManager.PERMISSION_GRANTED && r != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, EXTERNAL_PERMISSIONS, EXTERNAL_CODE); 
    } else { 
     Toast.makeText(this, "Permissions already granted", Toast.LENGTH_SHORT).show(); 
     perm=true; 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode){ 
     case EXTERNAL_CODE: 
      if(ActivityCompat.checkSelfPermission(this,permissions[0])==PackageManager.PERMISSION_GRANTED) 
      { 
       perm=true; 
      } 
      else { 
       Toast.makeText(this,"Permissions denied",Toast.LENGTH_LONG).show(); 
       perm=false; 
      } 
      break; 
    } 
} 
} 

In dieser Aktivität mich für die Berechtigungen stellen und erst dann kann ich einen neuen Standort hinzuzufügen. Die App wechselt regelmäßig zur nächsten Aktivität, die erteilten Toast-Berechtigungen werden angezeigt, auch wenn ich die App zum ersten Mal installiere, was etwas komisch wirkt. Ich benutze den gleichen Code, um die Write External und Kameraberechtigungen in einer anderen Funktion der App anzufordern, und es funktioniert gut.

Ich habe auch den Code meiner zweiten Aktivität, wo ich die Lage

erhalten möchte
private EditText editTitleLocation, addressText, latText,longText; 
private Button saveLocationButton, deleteLocationButton, navigateButton,findLocationButton; 
private static final int UPDATE_TIME = 15000; 
private static final int FASTER_UPDATE_TIME = 10000; 
private GoogleApiClient myGoogleApi; 
private Location location; 
private LocationRequest myLocationRequest; 
private static final int CHECK_CODE=1; 
private double longitude,latitude; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_location_second); 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.setHomeButtonEnabled(true); 
    actionBar.setDisplayHomeAsUpEnabled(true); 
    actionBar.setDisplayShowHomeEnabled(true); 
    initializeViews(); 
    buildGoogleApi(); 

} 

private void initializeViews(){ 
    editTitleLocation = (EditText)findViewById(R.id.editTitleLocation); 
    addressText = (EditText)findViewById(R.id.addressText); 
    latText = (EditText)findViewById(R.id.latitudeText); 
    longText=(EditText)findViewById(R.id.longitudeText); 
    saveLocationButton = (Button)findViewById(R.id.saveLocation); 
    deleteLocationButton = (Button)findViewById(R.id.deleteLocation); 
    findLocationButton = (Button)findViewById(R.id.findLocation); 
    navigateButton= (Button)findViewById(R.id.navigateLocation); 
    saveLocationButton.setOnClickListener(this); 
    deleteLocationButton.setOnClickListener(this); 
    findLocationButton.setOnClickListener(this); 
    navigateButton.setOnClickListener(this); 

} 

public void onStart(){ 
    super.onStart(); 
    if(myGoogleApi!=null){ 
     myGoogleApi.connect(); 
    } 
} 

public void onPause(){ 
    super.onPause(); 
    if(myGoogleApi!=null) 
    LocationServices.FusedLocationApi.removeLocationUpdates(myGoogleApi,LocationSecondActivity.this); 
} 

public void onStop(){ 
    super.onStop(); 
    myGoogleApi.disconnect(); 
} 

private synchronized void buildGoogleApi(){ 
    myGoogleApi = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API).build(); 
} 

private void createRequest(){ 

    myLocationRequest = new LocationRequest(); 
    myLocationRequest.setInterval(UPDATE_TIME) 
        .setFastestInterval(FASTER_UPDATE_TIME) 
        .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(myLocationRequest); 
    PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(myGoogleApi,builder.build()); 

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
     @Override 
     public void onResult(LocationSettingsResult result) { 
      final Status status = result.getStatus(); 
      switch (status.getStatusCode()){ 
       case LocationSettingsStatusCodes.SUCCESS: 
        retrieveLocation(); 
        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        try{ 
         status.startResolutionForResult(LocationSecondActivity.this,CHECK_CODE); 
        }catch (IntentSender.SendIntentException e){ 
         e.printStackTrace(); 
        } 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        Toast.makeText(LocationSecondActivity.this,"Settings Change Unavailable",Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }); 
} 

private void retrieveLocation(){ 
    try { 
     location = LocationServices.FusedLocationApi.getLastLocation(myGoogleApi); 
    }catch (SecurityException ex){ 
     ex.printStackTrace(); 
    } 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode){ 
     case CHECK_CODE: 
      switch (requestCode){ 
       case Activity.RESULT_OK: 
       retrieveLocation(); 
        break; 
       case Activity.RESULT_CANCELED: 
        break; 
      } 
      break; 
    } 
} 

@Override 
public void onConnected(Bundle bundle) { 
    createRequest(); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    Toast.makeText(this,"Google Api can not connect",Toast.LENGTH_LONG).show(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    this.location=location; 
    longitude=location.getLongitude(); 
    latitude=location.getLatitude(); 
} 

@Override 
public void onClick(View v) { 
    int id = v.getId(); 

    switch (id){ 
     case R.id.saveLocation: 
      break; 
     case R.id.deleteLocation: 
      break; 
     case R.id.navigateLocation: 
      break; 
     case R.id.findLocation: 

      if(location!=null){ 
       latitude = location.getLatitude(); 
       Log.e("MALAKIS",String.valueOf(latitude)); 
       longitude=location.getLongitude(); 
       latText.setText(String.valueOf(latitude)); 
       longText.setText(String.valueOf(longitude)); 
      }else { 
       if(!myGoogleApi.isConnected()){ 
        myGoogleApi.connect(); 
        Log.e("ELSE","fdsfddsd"); 
       } 
       try { 

        LocationServices.FusedLocationApi.requestLocationUpdates(myGoogleApi, myLocationRequest, this); 
       }catch (SecurityException ex){ 
        ex.printStackTrace(); 
       } 
      } 

      break; 
    } 

} 

Hier wird die Ortskoordinaten ist Objekt null ist und die Sicherheitsposition zeigt getriggerten, dass ich nicht die feine Standorterlaubnis Kann mir bitte jemand in die richtige Richtung zeigen? Muss ich in der zweiten Aktivität noch einmal nach Berechtigungen fragen?

Das Protokoll zeigt diese unter:

W/System.err: java.lang.SecurityException: Client must have 
    ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY 
locations. 
05-30 10:50:40.516 32177-32177/com.example.notepad.isidorosioannou.notepad 
W/System.err:  at android.os.Parcel.readException(Parcel.java:1602) 
05-30 10:50:40.516 32177-32177/com.example.notepad.isidorosioannou.notepad 
W/System.err:  at android.os.Parcel.readException(Parcel.java:1555) 
05-30 10:50:40.516 32177-32177/com.example.notepad.isidorosioannou.notepad 
W/System.err:  at 
com.google.android.gms.internal.zzase$zza$zza.zza(Unknown Source) 
05-30 10:50:40.516 32177-32177/com.example.notepad.isidorosioannou.notepad 
W/System.err:  at com.google.android.gms.internal.zzasg.zza(Unknown 
Source) 
05-30 10:50:40.516 32177-32177/com.example.notepad.isidorosioannou.notepad 
W/System.err:  at com.google.android.gms.internal.zzash.zza(Unknown 
Source) 
05-30 10:50:40.516 32177-32177/com.example.notepad.isidorosioannou.notepad 
W/System.err:  at com.google.android.gms.internal.zzary$1.zza(Unknown 
Source) 
05-30 10:50:40.516 32177-32177/com.example.notepad.isidorosioannou.notepad 
W/System.err:  at com.google.android.gms.internal.zzary$1.zza(Unknown 
Source) 
05-30 10:50:40.516 32177-32177/com.example.notepad.isidorosioannou.notepad 
W/System.err:  at com.google.android.gms.internal.zzaad$zza.zzb(Unknown 
Source) 
+0

* der Sicherheitsstandort wird ausgelöst, indem ich zeige, dass ich nicht die genaue Standorterlaubnis habe * ... ist das eine Laufzeitausnahme oder IDE/Lint Warnung ... Ich wette auf Warnung ... und es hat nichts damit zu tun Tatsache, dass ** getLastLocation kann null zurückgeben und Sie müssen damit leben ** – Selvin

+0

Eine kleine Sache zu überprüfen, müssen Ihre und Elemente außerhalb von sein. Sie sollten unmittelbare Kinder der Wurzel Element sein. Manchmal, wenn Sie sie beim Start der App hineinlegen, wird der Standort zum Beispiel bereits verwendet und verursacht solche Probleme. – koksalb

+0

Ich habe meine Frage bearbeitet und auch das Log aufgenommen. Die Berechtigungen liegen außerhalb der . Ich kann die Koordinaten beim Testen auf Android 5.0, aber nicht in Android 6.0 – Akis

Antwort

1

put folgenden Code in Ihr askForPerm() -Methode: -

LocationRequest locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(30 * 1000); 
    locationRequest.setFastestInterval(5 * 1000); 
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() 
      .addLocationRequest(locationRequest); 
    builder.setAlwaysShow(true); //this is the key ingredient 

    PendingResult<LocationSettingsResult> result = 
      LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build()); 
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
     @Override 
     public void onResult(LocationSettingsResult result) { 
      final Status status = result.getStatus(); 
      final LocationSettingsStates state = result.getLocationSettingsStates(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 
        // All location settings are satisfied. The client can initialize location 
        // requests here. 
        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        // Location settings are not satisfied. But could be fixed by showing the user 
        // a dialog. 
        try { 
         // Show the dialog by calling startResolutionForResult(), 
         // and check the result in onActivityResult(). 
         status.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); 
        } catch (IntentSender.SendIntentException e) { 
         // Ignore the error. 
        } 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        // Location settings are not satisfied. However, we have no way to fix the 
        // settings so we won't show the dialog. 
        break; 
      } 
     } 
    }); 

Try this !! Es ist in meiner Anwendung funktioniert.

+0

Ich änderte meinen Code und fragte die Berechtigungen in der zweiten Aktivität und es funktioniert. Ich wollte auch eine Frage stellen. Ist es möglich zu überprüfen, ob der Benutzer mit dem WLAN oder dem Netzwerk verbunden ist und ihn auffordert, die Internetverbindung zu aktivieren? Weil die Einstellungen api, die ich benutze, den Benutzer nur dazu auffordert, den Zugriff auf seine Position zu ermöglichen. – Akis

+0

Ja, du kannst Folgendes überprüfen: - public boolean isConnected() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService (Activity.CONNECTIVITY_SERVICE); Netzwerkinfo networkInfo = connMgr.getActiveNetworkInfo(); if (networkInfo! = Null && networkInfo.isConnected()) Rückgabe true; sonst Rückgabe false; } –

Verwandte Themen