20330


質問は

  * 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]


CC BY-SA 3.0
2015-12-23T12:02:30.810
20314
2018-08-31T15:34:36.990
2015-12-23T12:53:28.407
7290
12608
question
android
AndroidStudio アクセス許可に、求めた覚えのない権限を求める


[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)


CC BY-SA 3.0
2015-12-24T04:11:54.100
20330
2015-12-24T04:23:41.007
2015-12-24T04:23:41.007
2808
2808
20314
answer


Android Studioをつかっている場合、Gradle Android
Pluginが依存ライブラリのAARに含まれるAndroidManifest.xmlのパーミッション（や、 `<activity>`
など）をマージします。これはマニフェストマージと呼ばれる処理です。

その結果、自分でAndroidManifestに書いていないパーミッションを追加されることがよくあります。取り除く方法は yukihane
さんが説明しているやりかたでいけると思います。しかし、どのライブラリがどのパーミッションを要求しているのかちゃんと確認したほうがいいでしょうね。


CC BY-SA 3.0
2016-01-07T04:09:37.830
20697
2016-01-07T04:09:37.830
114
20314
answer


Android
StudioからAndroidManifest.xmlファイルを開くと、画面下部にMergedManifestというタブがあり、そこからどのノードがどのライブラリのマニフェストに起因しているかが確認できます。


CC BY-SA 4.0
2018-08-31T15:34:36.990
47990
2018-08-31T15:34:36.990
20314
answer