为什么play-services-location需要android.permission.WRITE_EXTERNAL_STORAGE和android.permission.READ_EXTERNAL_STORAGE权限?

时间:2015-06-12 18:21:59

标签: android android-studio google-play-services android-permissions

我在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

我的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'
}

我添加的唯一内容是play-services-location。为什么这个库需要它?

1 个答案:

答案 0 :(得分:16)

简短回答:我不相信play-services-location确实需要这些权限。它似乎也不需要android.permission.ACCESS_NETWORK_STATEandroid.permission.INTERNET,它们也被添加。

更长的回答: 看看我的清单合并日志,似乎所有这四个权限都包含在play-services-maps的请求中,-location是自己链接的。我的应用程序不使用-maps,只需使用-location。

此外,我发现此行为只出现在play-services-location的7.5.0版本中;以前的版本没有包含-maps,也没有添加这些权限。

我实际上怀疑这种与play-services-maps的连接是偶然的,并且将在未来的GMS版本中删除。

跟进Mark Murphy(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。

2015年9月10日更新:Mark Murphy(@commonsware)在他的博客上完成了an excellent writeup on this issue,包括讨论我的解决方案的风险。