Andriod - カスタムパーミッションを定義する方法

アプリからのパーミッションを使用するには、 AndroidManifest.xml<use-permission ../>として定義することができます。

<uses-permission android:name="android.permission.INTERNET"/>

ここで使用されている "android.permission.INTERNET"のようなパーミッションは、Androidで定義されています。

もし私が作ったアプリだけ使用できるパーミッションを作成したい場合はどうでしょうか

誰カスタムパーミッションを定義することができ、私のエプマン使用できるようにすることができます。 もちろん、このように制限を設けておらず、パーミッション名さえ分かれば誰でも利用できるように作ることがあります。

この記事では、カスタムパーミッションを定義する方法を紹介し、それぞれの設定が何を意味するのか説明します。

カスタムパーミッションを定義

カスタムパーミッションはアプリの AndroidManifest.xmlに定義することができます。

次のように manifest属性の下に<permission />を定義します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.codechacha.custompermission">

    <permission
        android:name="com.codechacha.YOU_CAN_DO_SOMETHING"
        android:label="@string/perm_label"
        android:description="@string/perm_description"
        android:permissionGroup="android.permission-group.SMS"
        android:protectionLevel="normal" />

    ...
</manifest>

文字列は /res/values/strings.xmlに追加するだけです。

<resources>
    <string name="perm_label">Do Something</string>
    <string name="perm_description">You can do what you need to do</string>
</resources>

上記のコードで使用される属性は、次のような役割を果たします。

  • android:name:パーミッションの名前です。他のアプリでマイパーミッションを宣言するときに、この名前を使用する必要があります
  • android:label:パーミッションの名前で、SettingsアプリでLabelを画面に表示することができます
  • android:description:パーミッションの説明であり、Settingsアプリでdescription情報を使用して、画面に表示することができます
  • android:permissionGroup:パーミッションのグループです。グループも作成できますが、通常、Androidで定義されたグループを使用します。 (Android 10で、いくつかのパーミッションは、グループを定義しないように変更されました。
  • android:protectionLevel:パーミッションを付与する方針です。ポリシーに応じて、いくつかのエプマンパーミッションを得ることができます。また、インストール時にパーミッションを取得するか、実行時に獲得するか決めることができます

protectionLevelに使用される値は次のとおりです。

  • normal:use-permissionに私のパーミッションを定義すると、このアプリがインストールされたときに自動的にパーミッションが付与されます
  • dangerous:アプリのインストール時にパーミッションが付与されません。ユーザーに権限を要請し、許可する権限が付与されます
  • signature:パーミッションが定義されているアプリと同じkeyで署名されたアプリのみパーミッションが付与されます

同じ名前のパーミッションを複数のアプリで宣言することができます。しかし、デバイスに最初にインストールされているアプリがパーミッションのownerがされます。

そのため、他のエプドゥルとの衝突を避けるために、特別なパーミッションの名前を指定することをお勧め。

もし私のアプリがすべて同じ証明書で署名がされた場合は、それぞれのアプリで同じ名前のパーミッションを宣言しても問題ありません。

デバイスからの私のパーミッションを確認

上記のようにパーミッションを定義した場合はアプリをインストールしましょう。

インストール後、ターミナルに次のようなコマンドを入力すると、私のアプリの情報が出力されます。

$ adb shell dumpsys package [package name]

出力される情報の中に、次のように com.codechacha.YOU_CAN_DO_SOMETHINGパーミッションは、私のアプリで宣言した(sourcePackage)出てきます。 sourcePackageはパーミッションのOwnerを意味します。

$ adb shell dumpsys package com.codechacha.custompermission
....

Permissions:
  Permission [com.codechacha.YOU_CAN_DO_SOMETHING] (4449a84):
    sourcePackage=com.codechacha.custompermission
    uid=10149 gids=null type=0 prot=normal
    perm=Permission{e62326d com.codechacha.YOU_CAN_DO_SOMETHING}
    packageSetting=PackageSetting{87adea2 com.codechacha.custompermission/10149}

Packages:
  Package [com.codechacha.custompermission] (87adea2):
    userId=10149
    pkg=Package{f725733 com.codechacha.custompermission}
    codePath=/data/app/com.codechacha.custompermission-ehtFwFZRAWvVEW-o6kecbg==
    ...

adbの dumpsysコマンドは慣れていないが、パーミッションのOwnerが誰なのかを確認するのに役立ちます。

他のアプリからのパーミッションの登録

これまでカスタムパーミッションを作ってみました。 これで、他のアプリを作成し、このパーミッションを使用するようにmanifestを設定してみましょう。

次のように、他のアプリの AndroidManifest.xmluses-permissionマイパーミッションを追加してください。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.codechacha.myapplication">

    <uses-permission android:name="com.codechacha.YOU_CAN_DO_SOMETHING" />

    ...
</manifest>

そしてアプリをインストールしましょう。

上記で使用コマンドで、新しいアプリの情報を見ると、 install permissions:の下にパーミッションが追加されたことを見ることができます。 granted=trueなら、私のアプリがこの権限を得たことを意味します。 granted=falseは、権限が付与されなかったことを意味します。

$ adb shell dumpsys package com.codechacha.myapplication
....

Packages:
  Package [com.codechacha.myapplication] (acce3eb):
    userId=10150
    pkg=Package{970d548 com.codechacha.myapplication}
    codePath=/data/app/com.codechacha.myapplication-3WkQtOk9G9Y1uRgiirMopw==
    ....
    requested permissions:
      com.codechacha.YOU_CAN_DO_SOMETHING
    install permissions:
      com.codechacha.YOU_CAN_DO_SOMETHING: granted=true
      User 0: ceDataInode=-4294930485 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0 instant=false virtual=false
      overlay paths:
        /product/overlay/DisplayCutoutEmulationEmu01/DisplayCutoutEmulationEmu01Overlay.apk
        runtime permissions:

パーミッション com.codechacha.YOU_CAN_DO_SOMETHINGはprotectionLevelがnormalであるため、インストールと同時に許可された。 もしprotectionLevelがsignatureならパーミッションを提供するアプリと同じkeyで署名されたエプマン権限を得ることができます。

com.codechacha.YOU_CAN_DO_SOMETHINGパーミッションのprotectionLevelはnormalです。そのため、install permissionに分類がされます。

もしdangerousならruntime permissionに分類がされます。

SDK APIでアプリがどのようなパーミッションを持っているかどうかを確認することができます。しかし、上で紹介したadbコマンドを使用すると、簡単にデバッグすることができます。

まとめ

これまでカスタムパーミッションを定義する方法について説明しました。 protectionLevelの設定のみを知っておら自分が希望するパーミッションを作る難しさはないでしょう。

事実、Androidで提供されるパーミッションは、より多くのオプションがあり、より複雑です。 しかし、カスタムパーミッションは、Androidのように複雑にする必要はないので、これくらいだけ知っておくと思われる。

参考

Related Posts

codechachaCopyright ©2019 codechacha