Почему для местоположения игровых сервисов необходимы разрешения android.permission.WRITE_EXTERNAL_STORAGE и android.permission.READ_EXTERNAL_STORAGE?

Все, что у меня есть в AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

После загрузки APK в консоль разработчика он добавляет два новых разрешения: enter image description here

My build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "net.perspiratron.ifpaprofile"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 3
        versionName "1.2"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
//    wearApp project(':wear')
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.google.android.gms:play-services-analytics:7.5.0'
    compile 'com.google.android.gms:play-services-location:7.5.0'
    compile 'com.jjoe64:graphview:4.0.0'
}

Единственное, что я добавил, это расположение игровых сервисов. Зачем нужна эта библиотека?

Ответ 1

Короткий ответ: я не верю, что для игровых сервисов нужны эти разрешения. Также не требуется android.permission.ACCESS_NETWORK_STATE или android.permission.INTERNET, которые также добавляются.

Более длинный ответ: Глядя на мой манифестный журнал слияний, кажется, что все четыре из этих разрешений включены по запросу игровых сервисов-карт, которые -location связывает сам по себе. Мое приложение не использует -maps, just -location.

Кроме того, я обнаружил, что это поведение появилось в версии 7.5.0 для play-services-location; предыдущие версии не включали -maps и не добавляли эти разрешения.

Я действительно подозреваю, что это соединение с play-services-maps является случайным и будет удалено в будущей версии GMS.

Следуя ссылке, предоставленной Марком Мерфи (CommonsWare), вы можете удалить эти разрешения из своего приложения, добавив в свой манифест следующие строки:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" tools:node="remove" />
<uses-permission android:name="android.permission.INTERNET" tools:node="remove" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />

Обратите внимание, что вам также понадобится xmlns:tools="http://schemas.android.com/tools" в вашем открывшемся элементе <manifest ... >, чтобы они работали. И обычные оговорки применяются: мое приложение отлично работало после этого шага, но YMMV.


Обновление 10 сентября 2015 года: Марк Мерфи (@commonsware) сделал отличную запись по этому вопросу в своем блоге, включая обсуждение риски моего решения.