仅限 ACCESS_FINE_LOCATION 权限错误模拟器

Posted

技术标签:

【中文标题】仅限 ACCESS_FINE_LOCATION 权限错误模拟器【英文标题】:ACCESS_FINE_LOCATION permission error emulator only 【发布时间】:2015-11-20 08:52:11 【问题描述】:

我只在使用模拟器时遇到了一个奇怪的错误。 我发现了一个 9 个月前有相同问题的问题,但根本没有答案...

我正在使用谷歌播放服务位置来获取我的应用程序中的位置,并且我确定我的清单权限并且一切都在我的手机上完美运行,仅使用模拟器时会出现问题,我在两者上都尝试了不同的模拟器我的 iMac 和 Windows 机器。

我怀疑模拟器不支持这个基本功能!

这是我的清单代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.orderme.ordermeandroid" >
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

这里是触发异常的地方:

    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(5000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,mLocationRequest,this);

堆栈跟踪:

08-26 14:01:19.699  10157-10157/com.orderme.ordermeandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.orderme.ordermeandroid, PID: 10157
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.zzg$zza$zza.zza(Unknown Source)
        at com.google.android.gms.location.internal.zzi.zza(Unknown Source)
        at com.google.android.gms.location.internal.zzj.zza(Unknown Source)
        at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source)
        at com.google.android.gms.location.internal.zzd$1.zza(Unknown Source)
        at com.google.android.gms.common.api.zzc$zza.zzb(Unknown Source)
        at com.google.android.gms.common.api.zzf.zza(Unknown Source)
        at com.google.android.gms.common.api.zzf.zzb(Unknown Source)
        at com.google.android.gms.common.api.zzi.zzb(Unknown Source)
        at com.google.android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source)
        at com.orderme.ordermeandroid.Main.MainActivity.onConnected(MainActivity.java:184)
        at com.google.android.gms.common.internal.zzk.zzh(Unknown Source)
        at com.google.android.gms.common.api.zzg.zznt(Unknown Source)
        at com.google.android.gms.common.api.zzg.onConnected(Unknown Source)
        at com.google.android.gms.common.api.zzi$2.onConnected(Unknown Source)
        at com.google.android.gms.common.internal.zzj$zzg.zzoD(Unknown Source)
        at com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source)
        at com.google.android.gms.common.internal.zzj$zza.zzs(Unknown Source)
        at com.google.android.gms.common.internal.zzj$zzc.zzoF(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)

【问题讨论】:

我在模拟器上也遇到了这个错误,你在设备上测试过吗?当我在真实设备上测试时,它工作正常!! 模拟器没有安装google play服务,安装它们看看是否再次出现同样的错误 感谢您的评论,但帖子中的代码 sn-p 取自 googleapiclient 的 onConnected 方法,这意味着之前的一切都在工作并且它也在连接,此外,如果服务不可用我应该在使用没有权限的类时出错! “这里是触发异常的地方”——请发布您的堆栈跟踪。 【参考方案1】:

我的猜测是您在 Android 6.0+ 模拟器上运行此程序,并且您的 targetSdkVersion 为 23 或更高。

在这种情况下,ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION 是 the Android 6.0 runtime permission system 的一部分。修改您的应用以参与此系统,或将您的targetSdkVersion 降至 23 以下。

【讨论】:

谢谢!就是这样,虽然我讨厌新的权限方法,但它解决了问题 我在演示前一天更新了我的手机,并因此开始吓坏了。谢谢你,你救了我。 我是 Android 开发新手。您会修改您的回复以回答“要么修改您的应用程序以参与此系统,要么将您的 targetSdkVersion 降至 23 以下。”的问题吗?谢谢。 我将目标降低到 20 ,但它仍然会发生。有任何想法吗 ?谢谢 @BVtp 如果您的设备使用 api23 并且您的目标 sdk 20 如果它仍然崩溃,那么您可能会拒绝设置 gps。转到设置>应用>选择您的应用>权限并给予 GPS 权限。【参考方案2】:

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

如何查看是否有权限:

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        android.Manifest.permission.ACCESS_FINE_LOCATION);

如何申请你需要的权限:

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

    ActivityCompat.requestPermissions(thisActivity,
            new String[]Manifest.permission.ACCESS_FINE_LOCATION,
            MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

    // MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION is an
    // app-defined int constant. The callback method gets the
    // result of the request.

如何访问请求的结果:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) 
switch (requestCode) 
    case MY_PERMISSIONS_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 task you need to do.

         else 

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


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

了解有关权限的更多信息:https://guides.codepath.com/android/Understanding-App-Permissions

【讨论】:

【参考方案3】:

您无法从模拟器中获取当前位置。但是您可以模拟它来测试您的代码。 Here你可以找到如何模拟。

EDIT1: 有注here

注意:如果您同时使用 NETWORK_PROVIDER 和 GPS_PROVIDER,那么您只需要请求 ACCESS_FINE_LOCATION 权限,因为它包含两个提供商的权限。 (ACCESS_COARSE_LOCATION 的权限仅包括 NETWORK_PROVIDER 的权限。)

您应该只使用 ACCESS_FINE_LOCATION 权限。也许这会有所帮助。

【讨论】:

我以前试过这个,没有解决,我不介意得到空位置我正在处理这个,你可以看到错误来自PERMISSION, 是的也试过这个^_^,我认为commonsWare的答案是我现在正在尝试的答案【参考方案4】:

此问题是由 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 文档还逐步介绍了如何请求所需的权限。

【讨论】:

【参考方案5】:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

有时清单中缺少授予 ACCESS_FINE_LOCATION 权限的行。所以你需要在清单中提及它。

我这样做了,我的问题解决了。

这通常是因为我们在清单中授予了权限,因此应用程序会产生问题,因为不允许它访问权限并且文件会崩溃。

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


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

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

【讨论】:

以上是关于仅限 ACCESS_FINE_LOCATION 权限错误模拟器的主要内容,如果未能解决你的问题,请参考以下文章

为啥权限 Manifest.permission.ACCESS_FINE_LOCATION 没有激活“位置”选项?

Android 6.0“gps”位置提供程序需要 ACCESS_FINE_LOCATION 权限

Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题

Unity自己莫名其妙添加了ACCESS_FINE_LOCATION权限的问题

服务内 gps 的 requestPermissions()。错误:“位置提供程序需要 ACCESS_FINE_LOCATION 权限。”

Android权限ACCESS_FINE_LOCATION始终被拒绝