Android アプリに設定されたパーミッションを取得する

もしmanifestに設定されていないパーミッションが必要な機能を使うと無慈悲なSecurityExceptionが発生します。
それはもう、catch節をスルーするくらい無慈悲です。

このExceptionが発生するという事は、manifestとコードが不一致だということなので、コード直せボケ!
なのかもしれませんが、やはりコード内でパーミッションをチェックして条件分岐したい事もあるものです。
例えばライブラリとして公開する場合とか。

そんなわけで、パーミッションのリストを取得するメソッドと、お目当てのパーミッションがmanifestに存在するのか確認するメソッドをお届けします。
[code lang="java" light="true"]
   /**
     * 指定されたパーミッションがmanifestに記載されているかどうか確認します。
     * 
     * @param checkPermission 調査するパーミッション
     * @param context コンテキスト
     * @return true:記載されている /false:記載されていない
     */
    public boolean hasPermission(String checkPermission, Context context) {
        if (checkPermission == null || context == null) {
            // 引数が渡されていないケース
            return false;
        }
        String[] requestedPermissions = getPermissionList(context);
        if (requestedPermissions == null) {
            // manifestに一件もpermissionが設定されていないケース
            return false;
        }
        for (String str : requestedPermissions) {
            if (str.equals(checkPermission)) {
                // 調査するパーミッションが存在したケース
                return true;
            }
        }
        // 調査するパーミッションが存在しなかったケース
        return false;
    }

    /**
     * manifestに記載されているパーミッションのリストを返します。
     * 
     * @return パーミッションのリスト
     */
    public String[] getPermissionList(Context context) {
        PackageManager packageManager = context.getPackageManager();
        PackageInfo packageInfo = null;
        try {
            packageInfo = packageManager.getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
        } catch (NameNotFoundException e) {
            return null;
        }
        return packageInfo.requestedPermissions;
    }
[/code]




使い方

[code lang="java" light="true"]
String checkPermisson = "android.permission.READ_PHONE_STATE";

if (hasPermission(checkPermisson, context)) {
    Log.d("TAG", checkPermisson + " exist!");
} else {
    Log.d("TAG", checkPermisson + " not exist!");
}
[/code]



お役に立てば。