2015-08-18 12 views
74

Her zaman içerdiğini benim SecurityException atılan ve ayıklananları hata şekilde okur rağmen hata "gps ACCESS_FINE_LOCATION gerektiriyor" " "gps" konum sağlayıcı ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION izni gerektirir.Android my bildirim dosyası, ben uygulamayı çalıştırmak bu

Bu basit bir hata gibi görünüyor, ancak benim açık dosyam tamamen doğru. İşte bu benim MapActivity kodu burada da olduğu ve:

<?xml version="1.0" encoding="utf-8"?> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
<uses-permission android:name="com.dev.cromer.jason.coverme.permission.MAPS_RECEIVE" /> 

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

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 
    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value= "@string/google_maps_key" /> 

    <activity 
     android:name=".MapActivity" 
     android:label="@string/title_activity_map" > 
    </activity> 
</application> 

Benim Etkinlik:

package com.dev.cromer.jason.coverme; 

import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.support.v4.app.FragmentActivity; 
import android.os.Bundle; 
import android.util.Log; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class MapActivity extends FragmentActivity implements LocationListener { 

    private GoogleMap mMap; // Might be null if Google Play services APK is not available. 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_map); 

     setUpMapIfNeeded(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setUpMapIfNeeded(); 
    } 



    private void setUpMapIfNeeded() { 
     // Do a null check to confirm that we have not already instantiated the map. 
     if (mMap == null) { 
      // Try to obtain the map from the SupportMapFragment. 
      mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
        .getMap(); 

      // Check if we were successful in obtaining the map. 
      if (mMap != null) { 
       //mMap.setMyLocationEnabled(true); 
       //mMap.setOnMyLocationChangeListener(this); 
       setUpMap(); 
      } 
     } 
    } 


    private void setUpMap() { 
     mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); 
     mMap.setMyLocationEnabled(true); 

     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

     try { 
      Location myLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

      if (myLocation != null) { 
       Log.d("TAG", "Not null"); 
      } 
      else { 
       Log.d("TAG", "NULL"); 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
      } 
     } 
     catch (SecurityException se) { 
      Log.d("TAG", "SE CAUGHT"); 
      se.printStackTrace(); 
     } 
    } 


    @Override 
    public void onLocationChanged(Location location) { 
     Log.d("CHANGED", "LOCATION UPDATED"); 

    } 

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

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 
} 
+0

Android'in hangi sürümünde bunu test ediyorsunuz? – CommonsWare

+2

En yeni API: 23 –

+2

İlişkisiz, ancak iyi bir yer talep ederseniz, kaba talep etmenize gerek yoktur. Dahil. –

cevap

111

ACCESS_COARSE_LOCATION , ACCESS_FINE_LOCATION ve WRITE_EXTERNAL_STORAGE parçasıdır the Android 6.0 runtime permission system. Bunları yaptığınız gibi göstermeye ek olarak, da numaralı telefonun kullanıcı tarafından çalışma zamanında (requestPermissions() kullanarak) talep etmesini ve bunlara sahip olup olmadığınızı kontrol etmelisiniz (checkSelfPermission()'u kullanarak). Kısa vadede

Bir geçici çözüm bırakmaktır senin targetSdkVersion 23.

altına Ancak, er çalışma zamanı izin sistemi kullanmak için uygulamanızı güncellemek isteyecektir.

Örneğin, bu etkinlik beş izinle çalışır. Dört çalışma zamanı izinleri, şu anda sadece üç işlem yapıyor olsa da (çalışma zamanı izni listesine WRITE_EXTERNAL_STORAGE eklenmeden önce yazdım). requestPermissions için

(this sample project itibaren)

/*** 
Copyright (c) 2015 CommonsWare, LLC 
Licensed under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy 
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
by applicable law or agreed to in writing, software distributed under the 
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY KIND, either express or implied. See the License for the specific 
language governing permissions and limitations under the License. 

From _The Busy Coder's Guide to Android Development_ 
https://commonsware.com/Android 
*/ 

package com.commonsware.android.permmonger; 

import android.Manifest; 
import android.app.Activity; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
    private static final String[] INITIAL_PERMS={ 
    Manifest.permission.ACCESS_FINE_LOCATION, 
    Manifest.permission.READ_CONTACTS 
    }; 
    private static final String[] CAMERA_PERMS={ 
    Manifest.permission.CAMERA 
    }; 
    private static final String[] CONTACTS_PERMS={ 
     Manifest.permission.READ_CONTACTS 
    }; 
    private static final String[] LOCATION_PERMS={ 
     Manifest.permission.ACCESS_FINE_LOCATION 
    }; 
    private static final int INITIAL_REQUEST=1337; 
    private static final int CAMERA_REQUEST=INITIAL_REQUEST+1; 
    private static final int CONTACTS_REQUEST=INITIAL_REQUEST+2; 
    private static final int LOCATION_REQUEST=INITIAL_REQUEST+3; 
    private TextView location; 
    private TextView camera; 
    private TextView internet; 
    private TextView contacts; 
    private TextView storage; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    location=(TextView)findViewById(R.id.location_value); 
    camera=(TextView)findViewById(R.id.camera_value); 
    internet=(TextView)findViewById(R.id.internet_value); 
    contacts=(TextView)findViewById(R.id.contacts_value); 
    storage=(TextView)findViewById(R.id.storage_value); 

    if (!canAccessLocation() || !canAccessContacts()) { 
     requestPermissions(INITIAL_PERMS, INITIAL_REQUEST); 
    } 
    } 

    @Override 
    protected void onResume() { 
    super.onResume(); 

    updateTable(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.actions, menu); 

    return(super.onCreateOptionsMenu(menu)); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
     case R.id.camera: 
     if (canAccessCamera()) { 
      doCameraThing(); 
     } 
     else { 
      requestPermissions(CAMERA_PERMS, CAMERA_REQUEST); 
     } 
     return(true); 

     case R.id.contacts: 
     if (canAccessContacts()) { 
      doContactsThing(); 
     } 
     else { 
      requestPermissions(CONTACTS_PERMS, CONTACTS_REQUEST); 
     } 
     return(true); 

     case R.id.location: 
     if (canAccessLocation()) { 
      doLocationThing(); 
     } 
     else { 
      requestPermissions(LOCATION_PERMS, LOCATION_REQUEST); 
     } 
     return(true); 
    } 

    return(super.onOptionsItemSelected(item)); 
    } 

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

    switch(requestCode) { 
     case CAMERA_REQUEST: 
     if (canAccessCamera()) { 
      doCameraThing(); 
     } 
     else { 
      bzzzt(); 
     } 
     break; 

     case CONTACTS_REQUEST: 
     if (canAccessContacts()) { 
      doContactsThing(); 
     } 
     else { 
      bzzzt(); 
     } 
     break; 

     case LOCATION_REQUEST: 
     if (canAccessLocation()) { 
      doLocationThing(); 
     } 
     else { 
      bzzzt(); 
     } 
     break; 
    } 
    } 

    private void updateTable() { 
    location.setText(String.valueOf(canAccessLocation())); 
    camera.setText(String.valueOf(canAccessCamera())); 
    internet.setText(String.valueOf(hasPermission(Manifest.permission.INTERNET))); 
    contacts.setText(String.valueOf(canAccessContacts())); 
    storage.setText(String.valueOf(hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE))); 
    } 

    private boolean canAccessLocation() { 
    return(hasPermission(Manifest.permission.ACCESS_FINE_LOCATION)); 
    } 

    private boolean canAccessCamera() { 
    return(hasPermission(Manifest.permission.CAMERA)); 
    } 

    private boolean canAccessContacts() { 
    return(hasPermission(Manifest.permission.READ_CONTACTS)); 
    } 

    private boolean hasPermission(String perm) { 
    return(PackageManager.PERMISSION_GRANTED==checkSelfPermission(perm)); 
    } 

    private void bzzzt() { 
    Toast.makeText(this, R.string.toast_bzzzt, Toast.LENGTH_LONG).show(); 
    } 

    private void doCameraThing() { 
    Toast.makeText(this, R.string.toast_camera, Toast.LENGTH_SHORT).show(); 
    } 

    private void doContactsThing() { 
    Toast.makeText(this, R.string.toast_contacts, Toast.LENGTH_SHORT).show(); 
    } 

    private void doLocationThing() { 
    Toast.makeText(this, R.string.toast_location, Toast.LENGTH_SHORT).show(); 
    } 
} 

() fonksiyonu, parametreler sadece "ACCESS_COARSE_LOCATION" olmalıdır? Veya "android.permission.ACCESS_COARSE_LOCATION" adını tam olarak içermeli miyim?

Yukarıda gösterildiği gibi Manifest.permission'da tanımlanan sabitleri kullanacağım.

Ayrıca, istek kodu nedir? Eğer diğerinden bir requestPermissions() çağrıyı söyleyebilir böylece, onRequestPermissionsResult() için ilk parametre olarak size geri geçirilecek

.

+1

requestPermissions() işlevi için, parametreler sadece "ACCESS_COARSE_LOCATION" olmalıdır? Veya "android.permission.ACCESS_COARSE_LOCATION" adını tam olarak içermeli miyim? –

+0

Ayrıca, istek kodu nedir? –

+1

Teşekkür ederim, bu hatadan kurtuldu. LocationManager konumumu null olarak döndürmeye devam ettiğinden, konumuma erişme konusunda hâlâ sorun yaşıyorum, ancak bu hatayla alakalı değil. Çözümünüz için teşekkür ederiz! –

30

Benim basit bir çözüm bu

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) { 
    googleMap.setMyLocationEnabled(true); 
    googleMap.getUiSettings().setMyLocationButtonEnabled(true); 
} else { 
    Toast.makeText(this, R.string.error_permission_map, Toast.LENGTH_LONG).show(); 
} 

veya siz bu

} else { 
    ActivityCompat.requestPermissions(this, new String[] { 
     Manifest.permission.ACCESS_FINE_LOCATION, 
     Manifest.permission.ACCESS_COARSE_LOCATION }, 
     TAG_CODE_PERMISSION_LOCATION); 
} 
+0

laways başka bir kısma taşı :( –

+2

Bu "else" içinde izinler eklemek için bir diyalog ekleyin ve gitmekte fayda var. –

+0

Bu aslında Android 6 için bir düzeltme olduğundan şüphelenmenize gerek yok. Başka bir yerde izin istekleri –

2

Neden gibi başka yer izni iletişim kutusunu açabilirsiniz: "Beginning Android 6.0 (API seviyesi 23), kullanıcıların izinleri Uygulama çalışırken uygulamayı, uygulamayı yüklediklerinde değil."Bu durumda," ACCESS_FINE_LOCATION "bir" tehlikeli izin ve bu nedenle, bu "java.lang.SecurityException:" gps "konum sağlayıcı ACCESS_FINE_LOCATION izni gerektirir. hata (https://developer.android.com/training/permissions/requesting.html).

ÇÖZÜM: "İhtiyacınız olan izinleri isteyin" ve "İzin isteği yanıtını işlemek" başlıkları altında https://developer.android.com/training/permissions/requesting.html numaralı belgede sağlanan kodu uygulayarak.

İlgili konular