上次的获取权限信息的Demo略显繁琐,优化了一下,使用系统接口PermissionInfo获取常见的权限描述,如果是对系统不可知的权限,我们在自定义。另外自定义的权限信息函数也从if else语句换成了swithc case语句,虽然还是一大堆,但是看起来结构更清晰一些:
package com.zms.getpermission;
import android.app.ListActivity;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.ResolveInfo;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Created by AlexZhou on 2015/1/27.
* 8:48
*/
public class Main extends ListActivity {
HashMap hashMap = new HashMap();
List dataAppList = new ArrayList();
List systemAppList = new ArrayList();
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PackageManager pm = getPackageManager();
Intent query = new Intent(Intent.ACTION_MAIN);
query.addCategory("android.intent.category.LAUNCHER");
List resolves = pm.queryIntentActivities(query, PackageManager.GET_ACTIVITIES);
dataAppList.add(""); // take up the position, refresh it after getting dataApp size
for (int i = 0; i < resolves.size(); i++) {
ResolveInfo resolveInfo = resolves.get(i);
String packageName = resolveInfo.loadLabel(pm).toString();
String[] permission;
try {
// get permission list
permission = pm.getPackageInfo(resolveInfo.activityInfo.packageName,
PackageManager.GET_PERMISSIONS).requestedPermissions;
// app is system app ?
if (isSystemApp(resolveInfo)) {
systemAppList.add(packageName);
} else {
dataAppList.add(packageName);
}
hashMap.put(packageName, permission);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
dataAppList.set(0, "===== Data Apps(" + dataAppList.size() + ") =====");
dataAppList.add("");
dataAppList.add("===== System Apps(" + systemAppList.size() + ") =====");
dataAppList.addAll(systemAppList);
getListView().setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1,
dataAppList));
getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> arg0, View arg1, int position, long arg3) {
String[] permission = hashMap.get(dataAppList.get(position));
StringBuilder stringBuilder = new StringBuilder();
try {
for (int i = 0; i < permission.length; i++) {
stringBuilder.append(getPermissionDetailSys(permission[i]) + "\n");
}
Intent intent = new Intent(Main.this, ShowPermission.class);
intent.putExtra("strPermission", dataAppList.get(position) + " has " +
permission.length + " Permission(s):\n\n" + stringBuilder);
startActivity(intent);
} catch (Exception e) {
// ToDo:Handle Exception
}
}
});
}
private boolean isSystemApp(ResolveInfo resolveInfo) {
if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
return false;
} else {
return true;
}
}
/**
* use system func to get normal permission info
*
* @param permissionName
* @return string
*/
public String getPermissionDetailSys(String permissionName) {
String strPermissionInfo = "";
try {
PackageManager pm = Main.this.getPackageManager();
// get permission info by name
PermissionInfo permissionInfo = pm.getPermissionInfo(permissionName, 0);
// get permission group
PermissionGroupInfo permissionGroupInfo = pm.getPermissionGroupInfo(
permissionInfo.group, 0);
strPermissionInfo = "[" + permissionGroupInfo.loadLabel(pm).toString() + "] " +
permissionInfo.loadLabel(pm).toString() + ":\n" +
permissionInfo.loadDescription(pm).toString() + "\n";
} catch (PackageManager.NameNotFoundException e) {
// use our func if permission info not matched
return getPermissionDetail(permissionName) + "\n";
}
return strPermissionInfo;
}
/**
* if getPermissionDetailSys() is execute catch part, this func will run
*
* @param strPermission
* @return description of permission, or permission name if not matched.
*/
public String getPermissionDetail(String strPermission) {
switch (strPermission) {
/***** A *****/
case "android.permission.ACCESS_ALL_DOWNLOADS":
return getResources().getString(R.string.ACCESS_ALL_DOWNLOADS);
case "android.permission.ACCESS_CACHE_FILESY