最近剛好要用到android安裝apk所產生的permission granting view 如下
那其實這個view是在framework中產生的,我看光產這個view的class就四千多行,其中相關連的class更是不可能整個移植過來,上網google一下才發現(應該說是忘了)在一般app也能調用framework函數,只是你要確定安裝的device有著正規的framework,否則class會not found。
直接貼出我使用的function。這樣一來就能抓到這個view。
public static View getPermissionView(final Context context) {
try {
// android.widget.AppSecurityPermissions
// AppSecurityPermissions asp = new AppSecurityPermissions(this,
// packageName);
// asp.getPermissionsView()
// 原本在framework的使用方法
// 使用reflection得到class
Class clazz = Class.forName("android.widget.AppSecurityPermissions");
Constructor[] constructors = clazz.getConstructors();
for (Constructor c : constructors) {
Class[] parameterTypes = c.getParameterTypes();
for (Class cls : parameterTypes) {
System.out.println(cls.getName());
}
}
// loop找出constructor結構
Constructor c = constructors[1];
Object obj = c.newInstance(new Object[] { context, context.getPackageName() });
Method method = clazz.getMethod("getPermissionsView");
View view = (View) method.invoke(obj);
// ll_list_permission.addView(view);
ScrollView scrollview = new ScrollView(context);
ScrollView.LayoutParams params = new ScrollView.LayoutParams(
ScrollView.LayoutParams.MATCH_PARENT,
ScrollView.LayoutParams.MATCH_PARENT);
scrollview.setLayoutParams(params);
LinearLayout linearLayout = new LinearLayout(context);
LinearLayout.LayoutParams paramsLinear = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
linearLayout.setLayoutParams(paramsLinear);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.addView(view);
scrollview.addView(linearLayout);
return scrollview;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
使用的機制是java的refection,然後抓出constructor來建構這個class,而後invoke他的method,這文章對於reflection寫的很詳盡。
http://godleon.blogspot.tw/2007/09/class-class-java-class-class-jvm-class.html
最後就能傳出漂亮的permission view了。
