Подтвердить что ты не робот

Только эмулятор ошибки ACCESS_FINE_LOCATION

У меня возникает странная ошибка при использовании эмулятора ТОЛЬКО. Я нашел один вопрос, который имеет такую ​​же проблему 9 месяцев назад без каких-либо ответов...

Я использую местоположения сервисов Google для получения местоположений в своем приложении, и я уверен в своих разрешениях на наличие явных прав, и все работает отлично на моем телефоне, проблема возникает при использовании только эмулятора, и я пробовал разные эмуляторы на обоих мои машины 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)
4b9b3361

Ответ 1

Я предполагаю, что вы используете это на эмуляторе Android 6.0+, и у вас есть targetSdkVersion 23 или выше.

В этом случае ACCESS_COARSE_LOCATION и ACCESS_FINE_LOCATION являются частью системы разрешения времени выполнения Android 6.0. Либо измените свое приложение, чтобы принять участие в этой системе, либо отпустите targetSdkVersion ниже 23.

Ответ 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

Вы не можете получить текущее местоположение из эмулятора. Но вы можете подражать этому, чтобы проверить свой код. Здесь вы можете найти, как эмулировать.

EDIT1: Существует примечание здесь

Примечание. Если вы используете как NETWORK_PROVIDER, так и GPS_PROVIDER, вам необходимо запросить только разрешение ACCESS_FINE_LOCATION, поскольку оно включает разрешение для обоих поставщиков. (Разрешение для ACCESS_COARSE_LOCATION включает разрешение только для NETWORK_PROVIDER.)

Вы должны использовать только разрешение ACCESS_FINE_LOCATION. Возможно, это помогает.

Ответ 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>