清单文件
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "xxxxxxx"
}
dexOptions {
javaMaxHeapSize "4g"
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
lintOptions{
abortOnError false
}
}
repositories {
mavenCentral()
}
dependencies {
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:multidex:1.0.0'
compile 'com.android.support:appcompat-v7:21.0.3'
}
所以我无法理解为什么它需要位置许可。如何在我的应用程序中添加此位置权限?
#1 楼
compile 'com.google.android.gms:play-services:+'
该库将请求位置权限,因为一些Play服务需要它。
首先,请勿使用
+
。如果要允许自由浮动的修补程序级别(例如22.0.+
),这并不完全是疯狂的,但是对于该版本使用+
太疯狂了。下一步,请考虑使用一个(或多个)重点更强的补丁依赖性,而不是完整的Play Services SDK。这不仅可能会消除您不想要的权限,而且APK也会小很多。该文档介绍了可用的选项(请参阅“将API选择性地编译到可执行文件中”部分)。
如果仍然使用不需要的权限,则需要确定权限的位置来自。您的模块的
build/outputs/logs/
中应该有清单合并报告。理解起来有点困难,但是希望您可以识别出贡献此权限的库。另外,当您编辑清单时,Android Studio 2.2+会在子选项卡中显示合并的清单。 UPDATE 2020-03-24:现代版本的Android Studio也在清单编辑器的“合并的清单”子选项卡中显示此内容,并使用颜色编码尝试向您显示哪些权限来自于哪些库。此时,您需要决定如何进行操作:
删除权限的最安全的答案是不再使用该库,而是找到其他解决方案您尝试使用该库解决的任何问题
,或使用许可权限
,或尝试将以下内容添加到应用的清单中:
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
tools:node="remove" />
这将要求您将
xmlns:tools="http://schemas.android.com/tools"
添加到根<manifest>
元素(如果尚不存在)。这将告诉构建工具明确排除此权限,即使库正在提供它。但是,您对这些库的使用可能会中断。仅当您有一支专门的测试团队可以花费时间来确保您决定阻止此权限的决定不会导致崩溃或影响用户的其他行为时,才执行此操作。评论
大!谢谢! Google Play服务添加了一些奇怪的权限,例如android.permission.USE_CREDENTIALS和Permission.GET_ACCOUNTS,我的应用不需要任何这些权限,“删除”解决方案将这些权限排除在外。这样做的时候,只有在查看日志文件时,我才能知道它们的来源。
– Moti Bartov
16年4月5日在19:39
#2 楼
对于新版本的Google Play服务库,您只需添加库的必需部分作为依赖项。例如,如果您仅使用Google Play服务库来展示Admob中的广告,则将compile 'com.google.android.gms:play-services:+'
替换为
compile 'com.google.android.gms:play-services-ads:7.5.0'
这将删除其他不必要的权限。
#3 楼
您需要检查合并的清单。使用的库也可以请求权限。
那是该权限的来源。
评论
也许您正在使用一些使用这些附加权限的库检查位于“ app \ build \ intermediates \ manifests \ debug”中的清单(其中“ app”是应用程序的主模块名称)。它包含位置权限吗?
您可以向我们展示您在项目中可能使用的任何其他库吗?
可能是由ACCESS_NETWORK_STATE或ACCESS_WIFI_STATE之一引起的?尝试暂时将其删除,以查看是否摆脱了位置权限。