スマゲ

スマートなゲームづくりを目指して日々精進

Android6.0からのPermissionの仕様変更についてのまとめ

Android6.0(Marchmallow)から一部のPermissionについて仕様が変わりました

■AndroidのSystem Permissionについて
アプリケーション上で特定の動作を行いたい場合、その内容に応じてユーザーに対して許可を取る必要がある。たとえば電話機能を利用したアプリの場合は CALL_PHONE の許可が必要。

■System Permissionを利用する
作成したAndroidアプリのAndroidManifestに利用したいPermissionを記述することでアプリがその機能を利用できるようになる

例: 外部ストレージに対しての I/O を行いたい場合

<uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
     android:maxSdkVersion="18" />

■今までのSystem Permissionの許可方法
Google Play StoreやAndroid Marketにてアプリをインストールする際に必要な権限が表示される。ユーザーがその権限を確認してインストールした時点で対象のアプリのすべてのSystem Permissionが許可される。
この方法の問題点として、危険な権限等がアプリに組み込まれていたとしてもユーザーが気づかずにアプリをインストールしてしまうことや、アプリがそれぞれの権限をどの理由で利用するかの判断が難しいことがある

■Android6.0からのSystem Permissionについて
Android6.0でのSystem Permissionについての大きな変更点はGoogleが危険と判断したSystem Permissionに関してはデフォルトで禁止となり、アプリ側で動的に許可を得なければならない。例えばカメラアプリで写真を撮りたい場合は、アプリ内で一度ユーザーに対してカメラ機能の利用許可を得るためのダイアログをだし、許可して貰う必要がある。

危険なPermissionがデフォルトで禁止になる条件
・動作端末がAndroid6.0(API level 23)以上
・アプリのtargetSdkVersionが23以上

■仕様変更への対処方法
・targetSdkVersionを22以下にする
仮に動作端末がAPI Level 23以上であったとしてもtargetSdkVersionが22以下の場合は今までどおり権限の許可を得ることが出来ます。ただしAPI level 23以降の機能を利用することができなくなるので、アプリを更新していくつもりならやらないほうが良い

・ランタイム中にパーミッションを許可するダイアログを出す
簡単に実装方法をまとめました
smartgames.hatenablog.com


■まとめ
これからアプリを作成していくうえで実装する項目が増えてしまったが、ユーザーが不利益を被る危険性が低くなる良い仕様変更なのでしっかりと対応していきたい
ちなみにUnityは5.2.4からこの機能に対応し、ゲーム起動時に危険な権限の許可を促すダイアログが出るようになった。しかし、この仕様変更のそもそもの主旨に反している気がするので、調度よいタイミングで聞けるようなプラグインを作成予定

■参考
System Permissions | Android Developers
<permission> | Android Developers
Requesting Permissions at Run Time | Android Developers
<uses-permission> | Android Developers
<uses-permission-sdk-23> | Android Developers

■おまけ
危険な権限一覧(2016/03/20)
CALENDAR:
READ_CALENDAR
WRITE_CALENDAR
CAMERA:
CAMERA
CONTACTS:
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION:
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE:
RECORD_AUDIO
PHONE:
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS:
BODY_SENSORS
SMS:
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE:
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE