gpt4 book ai didi

android - 尽管在 list 文件中指定了权限,但 ACCESS_FINE_LOCATION SecurityException

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:24:01 25 4
gpt4 key购买 nike

我的应用正在尝试访问设备的位置,并且我在 AndroidManifest.xml 中包含了以下内容:

<manifest 
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application>
<meta-data android:name="com.google.android.gms.version" />
</application>

</manifest>

我已经按如下方式实现了 GoogleApiClient.ConnectionCallbacks 以访问位置服务:

public class BackgroundLocationService implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {

private static final String TAG = BackgroundLocationService.class.getSimpleName();

private static GoogleApiClient googleApiClient;
private static PendingIntent locationCallback;

public static int LOCATION_INTERVAL = 10000;
public static int FAST_INTERVAL = 5000;

@Override
public void onConnected(Bundle bundle) {
Log.i(TAG, "Connected to Google API");

LocationRequest request = new LocationRequest();
request.setInterval(LOCATION_INTERVAL);
request.setFastestInterval(FAST_INTERVAL);
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, request, locationCallback);
}

@Override
public void onConnectionSuspended(int i) {
Log.i(TAG, Integer.toString(i));
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.i(TAG, connectionResult.toString());
}
}

当我触发位置服务调用时,抛出以下异常:

java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations.
at android.os.Parcel.readException(Parcel.java:1599)
at android.os.Parcel.readException(Parcel.java:1552)
at com.google.android.gms.location.internal.zzi$zza$zza.zza(Unknown Source)
at com.google.android.gms.location.internal.zzk.zza(Unknown Source)
at com.google.android.gms.location.internal.zzl.zza(Unknown Source)
at com.google.android.gms.location.internal.zzd$7.zza(Unknown Source)
at com.google.android.gms.location.internal.zzd$7.zza(Unknown Source)
at com.google.android.gms.internal.zzlb$zza.zzb(Unknown Source)
at com.google.android.gms.internal.zzlf.zza(Unknown Source)
at com.google.android.gms.internal.zzlf.zzb(Unknown Source)
at com.google.android.gms.internal.zzli.zzb(Unknown Source)
at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source)
at com.localz.spotzpush.sdk.service.BackgroundLocationService.onConnected(BackgroundLocationService.java:45)
at com.google.android.gms.common.internal.zzk.zzh(Unknown Source)
at com.google.android.gms.internal.zzlg.zznU(Unknown Source)
at com.google.android.gms.internal.zzlg.onConnected(Unknown Source)
at com.google.android.gms.internal.zzli$2.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzj$zzg.zzpf(Unknown Source)
at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source)
at com.google.android.gms.common.internal.zzj$zza.zzt(Unknown Source)
at com.google.android.gms.common.internal.zzj$zzc.zzph(Unknown Source)
at com.google.android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我正在使用一个真实的设备来产生这个问题,并且一直在摸索为什么抛出异常。

最佳答案

此问题是由 Android 6.0 的一项新功能引起的。

从 Android 6.0(API 级别 23)开始,用户在应用运行时向应用授予权限,而不是在安装应用时。

http://developer.android.com/training/permissions/requesting.html

为了在未明确授予权限时解决此问题,我进行了检查以包装位置服务调用(根据 Google 文档,稍作修改)。

int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);

if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
//Execute location service call if user has explicitly granted ACCESS_FINE_LOCATION..
}

Google 文档还逐步介绍了如何请求所需的权限。

2016 年 10 月 12 日更新

加入@ Siddharth的更新以包含对 checkSelfPermission()

更有帮助的答案
//For this example, run the check onResume()
@Override
public void onResume() {

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

// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {

// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.

} else {

// No explanation needed, we can request the permission.
// PERMISSION_REQUEST_ACCESS_FINE_LOCATION can be any unique int
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_ACCESS_FINE_LOCATION);
}
}
}

@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_ACCESS_FINE_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {

// permission was granted, yay! Do the
// contacts-related task you need to do.

} else {

// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}

// other 'case' lines to check for other
// permissions this app might request
}
}

关于android - 尽管在 list 文件中指定了权限,但 ACCESS_FINE_LOCATION SecurityException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33406762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com