【问题标题】:Why does play-services-location need the android.permission.WRITE_EXTERNAL_STORAGE and android.permission.READ_EXTERNAL_STORAGE permissions?为什么 play-services-location 需要 android.permission.WRITE_EXTERNAL_STORAGE 和 android.permission.READ_EXTERNAL_STORAGE 权限?
【发布时间】:2015-08-28 20:41:04
【问题描述】:

我在 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上传到开发者控制台后,新增两个权限:

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

我唯一添加的是播放服务位置。为什么这个库需要它?

【问题讨论】:

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


【解决方案1】:

简短回答:我不相信 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" />

请注意,您还需要在开头的 &lt;manifest ... &gt; 元素中添加 xmlns:tools="http://schemas.android.com/tools" 才能使这些工作。并且通常的警告适用:我的应用在执行此步骤后运行良好,但是 YMMV。


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

【讨论】:

  • 谢谢,我用apktool验证了apk中的AndroidManifest.xml有我期望的权限。
  • 需要注意的一点是,位置依赖于地图,因为地图包含 LatLng,这是许多位置 API 的基础。
  • 我不明白我使用的库(例如 play-services)如何为我请求权限?
猜你喜欢
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
相关资源
最近更新 更多