2014年8月1日 星期五

android調用framework函數的用法。


最近剛好要用到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了。


沒有留言:

張貼留言