Android 6.0動的権限の紹介
4303 ワード
Android 6.0は、ios上の権限申請と同様に、権限の取得はappインストール時ではなく、実行時に申請される新しい権限管理メカニズムを推進し始めた.
もちろん、すべての権限が動的に申請されるわけではありません.グーグルは権限を2つの種類に分け、普通の権限と危険な権限に分けています.通常の権限については、AndroidManifestで以前と同じです.xmlで申請すればいいが、危険権限については、実行時に動的に申請し、ユーザーの許可を得てから使用しなければならない.次に、通常の権限区分の権限を示します. ACCESS_LOCATION_EXTRA_COMMANDS ACCESS_NETWORK_STATE ACCESS_NOTIFICATION_POLICY ACCESS_WIFI_STATE BLUETOOTH BLUETOOTH_ADMIN BROADCAST_STICKY CHANGE_NETWORK_STATE CHANGE_WIFI_MULTICAST_STATE CHANGE_WIFI_STATE DISABLE_KEYGUARD EXPAND_STATUS_BAR FLASHLIGHT GET_PACKAGE_SIZE INTERNET KILL_BACKGROUND_PROCESSES MODIFY_AUDIO_SETTINGS NFC READ_SYNC_SETTINGS READ_SYNC_STATS RECEIVE_BOOT_COMPLETED REORDER_TASKS REQUEST_INSTALL_PACKAGES SET_TIME_ZONE SET_WALLPAPER SET_WALLPAPER_HINTS TRANSMIT_IR USE_FINGERPRINT VIBRATE WAKE_LOCK WRITE_SYNC_SETTINGS SET_ALARM INSTALL_SHORTCUT UNINSTALL_SHORTCUT 通常の権限は携帯電話そのものに関する機能であり,ユーザデータの権限(ほとんどのappが申請する読み書きSDカードの権限を含む)は危険な権限に分類されていることがわかる.API 23には、ContextCompatで呼び出すことも、現在のactivityで直接呼び出すこともできる権限に関するいくつかのインタフェースが追加されています.
インタフェースの実装
セキュリティのためにも、ユーザー体験を考慮しないわけにはいかないし、ユーザーがあまりにも邪魔されないように、API 23はpemission_を提案している.group権限グループの概念、すなわち権限をグループ化し、ユーザーがグループ内の権限を授権すれば、そのグループの他の権限は再授権する必要はありません.例えばユーザがREAD_を許可したPHONE_STATEさん、それでは次回CALL_を申し込みますPHONEでは、ユーザーに許可を与えることはできません.
Permission Group
Permissions
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
もう一つのAPI、Activity Compat.shouldShowRequestPermissionRationale
他にも2つの特殊な権限があり、SYSTEM_ALERT_WINDOWとWRITE_SETTINGS、この2つの権限の管理はシステム応用管理の中で、もし使う必要があるならば、intent方式を通じてこの管理ページを起動する必要があって、ユーザーは後で使うことができることを許可して、この2つの権限があるかどうかを判断する方法はそれぞれ
もちろん、すべての権限が動的に申請されるわけではありません.グーグルは権限を2つの種類に分け、普通の権限と危険な権限に分けています.通常の権限については、AndroidManifestで以前と同じです.xmlで申請すればいいが、危険権限については、実行時に動的に申請し、ユーザーの許可を得てから使用しなければならない.次に、通常の権限区分の権限を示します.
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
このインタフェースの戻り値は、パーミッションクエリの結果を表します.PackageManager.PERMISSION_GRANTEDはユーザーが許可したことを示し、PackageManager.PERMISSION_DENIEDは、ユーザーがまだ権限を持っていないことを示しています.これは、別のインタフェースを使用して権限申請を行う必要があります.この方法は使用時にシステムバージョンを判断する必要はありません.方法内部でバージョンが区別されるため、API 23以下であればmanifestをチェックすることで直接行います.public static void requestPermissions (Activity activity, String[]
permissions, int requestCode)
パラメータの最初のactivity、すなわち権限の申請はUIスレッドで行わなければならない.2番目のパラメータは申請する権限配列であり、3番目のパラメータ要求コードはコールバック時に異なる権限申請を区別するために使用される(例えば、同じactivityの2つの場所で2つの異なる権限を申請した可能性がある).インタフェースの実装
ActivityCompat.OnRequestPermissionsResultCallback
public abstract void onRequestPermissionsResult (int requestCode, String[]
permissions, int[] grantResults)
Activityはリクエスト申請結果を受信できます.grantResults配列は、各権限申請の結果を記録する.requestCodeは申請したばかりの値です.セキュリティのためにも、ユーザー体験を考慮しないわけにはいかないし、ユーザーがあまりにも邪魔されないように、API 23はpemission_を提案している.group権限グループの概念、すなわち権限をグループ化し、ユーザーがグループ内の権限を授権すれば、そのグループの他の権限は再授権する必要はありません.例えばユーザがREAD_を許可したPHONE_STATEさん、それでは次回CALL_を申し込みますPHONEでは、ユーザーに許可を与えることはできません.
Permission Group
Permissions
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
もう一つのAPI、Activity Compat.shouldShowRequestPermissionRationale
public static boolean shouldShowRequestPermissionRationale (Activity
activity, String permission)
以前にユーザーがこの権限を拒否したかどうかを確認するために使用されます.これには、プロンプトが選択されていないことも含まれます.この場合、この権限appが何に使用されているかをユーザーに伝えるプロンプトが必要になる場合があります.他にも2つの特殊な権限があり、SYSTEM_ALERT_WINDOWとWRITE_SETTINGS、この2つの権限の管理はシステム応用管理の中で、もし使う必要があるならば、intent方式を通じてこの管理ページを起動する必要があって、ユーザーは後で使うことができることを許可して、この2つの権限があるかどうかを判断する方法はそれぞれ
Settings.canDrawOverlays(Context) //SYSTEM_ALERT_WINDOW
Settings.System.canWrite(Context) //WRITE_SETTINGS
さらにintentでURIを指定することで、アプリケーション管理UIを起動した後、指定されたappの管理ページに直接アクセスできるようになります.Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:com.app.my"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(intent);
もちろん、これらの変更はappがコンパイル時に使用するsdkバージョンを23に変更した場合にのみ使用されます.コンパイル時にsdkバージョンが23でない場合、互換性のある方法で実行され、システムは静的な方法で権限チェックを行います.