AndroidStudio アクセス許可に、求めた覚えのない権限を求める


質問は

  * AndroidManifest.xml 以外で 権限の変更がされることはあるのか？
  * 画像ストレージへの許可が必要と表示させる原因について

現状  
Googleプレイにて公開した時のアクセス許可に次の項目が示されます。  
ですが、自分で許可した覚えがあるのはインターネット接続関連のみです。

  * ID  
この端末上のアカウントの検索

  * 連絡先  
この端末上のアカウントの検索

  * 画像/メディア/ファイル  
USB ストレージのコンテンツの変更または削除  
USB ストレージのコンテンツの読み取り

  * ストレージ  
USB ストレージのコンテンツの変更または削除  
USB ストレージのコンテンツの読み取り

  * その他  
インターネットからデータを受信する  
ネットワークへのフルアクセス  
ネットワーク接続の表示  
この端末上のアカウントの使用

上記項目がアクセス許可として求められます。  
admobの広告を使用しているためID等の取得はわかりますが  
画像スイトレージへのアクセスの許可が求められるのはなぜでしょう？

以下マニフェストファイルです

[code]

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
    android:value=”@integer/google_play_services_version”
    <application
        android:allowBackup="true"
        android:icon="@drawable/icon_200"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
        android:screenOrientation="portrait"
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.google.android.gms.ads.AdActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
            android:theme="@android:style/Theme.Translucent" />
    </application>
    
[/code]




[Manifest.permission | Android Developers の
`WRITE_EXTERNAL_STORAGE`](http://developer.android.com/intl/ja/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE)
項より:

> If both your minSdkVersion and targetSdkVersion values are set to 3 or
> lower, the system implicitly grants your app this permission.

[Manifest Merging | Android Developers の Implicit
Permissions節](http://developer.android.com/intl/ja/tools/building/manifest-
merge.html#implicit-permissions)より:

> Importing a library that targets an Android runtime with implicitly granted
> permissions may automatically add the permissions to the resulting merged
> manifest.  
>  For example, if an application with a targetSdkVersion of 16 imports a
> library with a targetSdkVersion of 2, Android Studio adds the
> WRITE_EXTERNAL_STORAGE permission to ensure permission compatibility across
> the SDK versions.

というわけで、

  * 自身のアプリのtargetSdkVersion/minSdkVersionが3以下である

  * 依存しているライブラリのtargetSdkVersion/minSdkVersionが3以下である

のいずれかの場合に`WRITE_EXTERNAL_STORAGE`権限が暗黙的に与えられます(のでインストール時ユーザの許可が必要になります)。他の権限も同様の理屈です。

* * *

実際にはこの権限は不要だとわかっている場合は、自身のAndroidManifest.xmlに記述を追加することで該当権限を要求しないようにできる…ようです(今知りました)。

前述Manifest Mergingの[Merge Conflict Markers and
Selectors節](http://developer.android.com/intl/ja/tools/building/manifest-
merge.html#markers-selectors)にあるとおり、[Manifest
Merger](http://tools.android.com/tech-docs/new-build-system/user-
guide/manifest-merger)に、明示的にマージ結果を上書きする機能があります。  
このうちの、`remove`機能を用いて本来不要な権限を削除します。

> **< tools:node=”remove”>**  
>  Remove the annotated element from the resulting XML.(後略)

具体的には、自身のAndroidManifest.xmlに次のように記載します。

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
        package=... >
    
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove"/>
    ...
    
[/code]

* * *

…と公式ドキュメントを引いて説明してみたものの、多分下記サイトの方が分かりやすいと思います。

  * [対処法: 不必要なPermissionが勝手に追加されてるとき | Android開発・エラー置き場](http://android.tecc0.com/?p=161)




[Manifest.permission | Android Developers の
`WRITE_EXTERNAL_STORAGE`](http://developer.android.com/intl/ja/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE)
項より:

> If both your minSdkVersion and targetSdkVersion values are set to 3 or
> lower, the system implicitly grants your app this permission.

[Manifest Merging | Android Developers の Implicit
Permissions節](http://developer.android.com/intl/ja/tools/building/manifest-
merge.html#implicit-permissions)より:

> Importing a library that targets an Android runtime with implicitly granted
> permissions may automatically add the permissions to the resulting merged
> manifest.  
>  For example, if an application with a targetSdkVersion of 16 imports a
> library with a targetSdkVersion of 2, Android Studio adds the
> WRITE_EXTERNAL_STORAGE permission to ensure permission compatibility across
> the SDK versions.

というわけで、

  * 自身のアプリのtargetSdkVersion/minSdkVersionが3以下である

  * 依存しているライブラリのtargetSdkVersion/minSdkVersionが3以下である

のいずれかの場合に`WRITE_EXTERNAL_STORAGE`権限が暗黙的に与えられます(のでインストール時ユーザの許可が必要になります)。他の権限も同様の理屈です。

* * *

実際にはこの権限は不要だとわかっている場合は、自身のAndroidManifest.xmlに記述を追加することで該当権限を要求しないようにできる…ようです(今知りました)。

前述Manifest Mergingの[Merge Conflict Markers and
Selectors節](http://developer.android.com/intl/ja/tools/building/manifest-
merge.html#markers-selectors)にあるとおり、[Manifest
Merger](http://tools.android.com/tech-docs/new-build-system/user-
guide/manifest-merger)に、明示的にマージ結果を上書きする機能があります。  
このうちの、`remove`機能を用いて本来不要な権限を削除します。

> **< tools:node=”remove”>**  
>  Remove the annotated element from the resulting XML.(後略)

具体的には、自身のAndroidManifest.xmlに次のように記載します。

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
        package=... >
    
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove"/>
    ...
    
[/code]

* * *

…と公式ドキュメントを引いて説明してみたものの、多分下記サイトの方が分かりやすいと思います。

  * [対処法: 不必要なPermissionが勝手に追加されてるとき | Android開発・エラー置き場](http://android.tecc0.com/?p=161)

