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で直接呼び出すこともできる権限に関するいくつかのインタフェースが追加されています.
    // 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でない場合、互換性のある方法で実行され、システムは静的な方法で権限チェックを行います.