もし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]
お役に立てば。