周知の通りこれ。
http://developer.android.com/preview/features/runtime-permissions.html
ProtectionLevelがNORMALやSignatureのパーミッションは影響を受けない1ということなので、じゃあ影響を受けるパーミッションは何で受けないのは何かという問題。
ユーザ操作で任意に付与・剥奪が許されているパーミッションは、
ここのTable1のgroupedなものと、それ以外(dangerousかつungroupedなパーミッション)。
それ以外っていうのは、M Developer PreviewではApp->PermissionのShowLegacyで表示されるパーミッション。frameworkが宣言してるパーミッションでは10個くらいあったと思う。
これらは、pmコマンドで容易に確認できる。
grouped
$adb shell pm list permissions -g`
dangerous
$adb shell pm list permissions -d
全部
$adb shell pm list permissions -f
pmコマンドでもいいけど、frameworkが宣言しているパーミッション2について、protection levelがどうなってるか調べてみた。
公式サイトには、internet
とalarm clock
はnormal
になったよと書いてる。
internetはLではdangerousだったのが、Mではnormalに変更さているが、alarm clockはSET_ALARMのことだろうか。
Lでもnormalのような気がするががが。
まぁ、いいか。
とりあえず、frameworkの全permissionのprotection levelを調べるコードを貼っておく。
public class MainActivity extends Activity {
private static final String TAG = "PERMISSION_INFO";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PackageInfo packageInfo = null;
try {
packageInfo = getPackageManager().getPackageInfo("android", PackageManager.GET_PERMISSIONS);
} catch (...) {...}
if (packageInfo == null) return;
for (PermissionInfo p : packageInfo.permissions) {
Log.d(TAG, p.name + ", " + getProtectionLevel(p));
}
}
private static String getProtectionLevel(PermissionInfo pi) {
StringBuffer protectionLevel = new StringBuffer();
int base = pi.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;
int flag = pi.protectionLevel & PermissionInfo.PROTECTION_MASK_FLAGS;
if (base == PermissionInfo.PROTECTION_NORMAL) {
protectionLevel.append("NORMAL | ");
} else if (base == PermissionInfo.PROTECTION_DANGEROUS) {
protectionLevel.append("DANGEROUS | ");
} else if (base == PermissionInfo.PROTECTION_SIGNATURE) {
protectionLevel.append("SIGNATURE | ");
} else if (base == PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM) {
protectionLevel.append("SIGNATURE_OR_SYSTEM | ");
} else {
protectionLevel.append("BASE_UNKNOWN | ");
}
if ((flag & PermissionInfo.PROTECTION_FLAG_APPOP) != 0) {
protectionLevel.append("APPOP | ");
}
if ((flag & PermissionInfo.PROTECTION_FLAG_DEVELOPMENT) != 0) {
protectionLevel.append("DEVELOPMENT | ");
}
if ((flag & PermissionInfo.PROTECTION_FLAG_SYSTEM) != 0) {
protectionLevel.append("SYSTEM");
}
return protectionLevel.toString();
}
}