Студия Android добавляет нежелательное разрешение после запуска приложения на реальном устройстве

После запуска приложения на устройстве требуется разрешение нежелательного расположения, которое не упоминается в файле манифеста. Хотя, когда я запускаю тот же код из моего друга Android Studio, чем обычно, без дополнительного разрешения требуется.

Файл манифеста

<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" />

enter image description here

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:+'

В этой библиотеке будут запрашиваться разрешения на доступ, так как это необходимо нескольким компонентам Служб Службы.

Во-первых, никогда не используйте +. Если вы хотите разрешить свободно плавающие уровни патчей (например, 22.0.+), это не совсем безумно, но использование + для версии является безумным.

Затем рассмотрите возможность использования одной (или более) более ориентированных зависимостей, а не полного SDK Служб Службы. Мало того, что это, возможно, устранит разрешение, которого вы не хотите, но ваш APK будет намного меньше. Документация охватывает доступные параметры (см. раздел "Выборочная компиляция API в ваш исполняемый файл" ).

Если у вас все еще есть разрешения, которые вам не нужны, вам нужно будет определить, откуда идут разрешения. В build/outputs/logs/ вашего модуля должен быть отчет о слиянии. Это будет немного сложно понять, но, надеюсь, вы можете определить библиотеку, которая вносит это разрешение. Кроме того, Android Studio 2.2+ покажет ваш объединенный манифест на суб-вкладке при редактировании манифеста.

В этот момент вам нужно решить, как действовать:

  • Самый безопасный ответ, который удаляет разрешение, больше не использует эту библиотеку, а вместо этого найдет другое решение любой проблемы, которую вы пытаетесь решить с помощью этой библиотеки.

  • Или, живите с разрешением

  • Или попробуйте добавить в манифест приложения следующее:

    <uses-permission
         android:name="android.permission.ACCESS_COARSE_LOCATION"
         tools:node="remove" />
    

Это потребует добавить xmlns:tools="http://schemas.android.com/tools" к корневому элементу <manifest>, если он еще не существует. Это покажет, что инструменты сборки явно исключают это разрешение, даже если библиотеки вносят его. Однако использование этих библиотек может сломаться. Выполняйте это только в том случае, если у вас есть специальная группа тестирования, которая может потратить время, необходимое для того, чтобы ваше решение заблокировать это разрешение не привело бы к сбоям или другим поведением, которое влияет на пользователя.

Ответ 2

Для новых версий библиотек Служб Google Play вы должны добавить только необходимую часть библиотеки в качестве зависимости. Например, если вы используете Google Play Service только для показа объявлений из Admob, замените

compile 'com.google.android.gms:play-services:+'

с

compile 'com.google.android.gms:play-services-ads:7.5.0'

Это приведет к удалению других ненужных разрешений.

Ответ 3

Вам необходимо проверить объединенный манифест.

Библиотеки, которые вы используете, также могут запрашивать разрешения.

Вот откуда это разрешение.

enter image description here