通过Robotium更改Android Apk区域设置

时间:2013-08-06 16:31:33

标签: localization apk robotium adb

我正在开发一个活动检测测试用例,它使用Robotium框架自动验证AUT。我想要自动化几种语言测试。我试图通过从AUT中提取资源并将本地语言环境配置强制转换为其他语言来改变语言,但无济于事:

    Locale locale = new Locale(lang);
    Locale.setDefault(locale);
    Configuration config = res.getConfiguration();      
    config.locale = locale;
    res.updateConfiguration(config, res.getDisplayMetrics());

我也听说过以前可能会使用活动管理器使用ADB更改语言,但我一直无法找到V4.2.2的工作解决方案。如果没有在应用程序本身嵌入代码或生成设备,有没有办法通过Robotium或其他方式远程更改语言环境?

提前致谢

2 个答案:

答案 0 :(得分:2)

前段时间我遇到过类似的问题,并提出了以下解决方案:

private void changeActivityLocale(final Activity a, String locale ){
    Resources res = a.getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = new Locale(locale);
    res.updateConfiguration(conf, dm);
    a.getResources().updateConfiguration(conf, dm);

    getInstrumentation().runOnMainSync(new Runnable() {
        public void run() {
            a.recreate();
        }
    });
}

在开始一些特定于语言环境的测试之前,我在我的测试用例中调用了这个方法。 希望它可以帮到你。

致以最诚挚的问候,

彼得

答案 1 :(得分:1)

protected void changeLocale(Locale locale)
        throws ClassNotFoundException, SecurityException,
        NoSuchMethodException, IllegalArgumentException,
        IllegalAccessException, InvocationTargetException,
        NoSuchFieldException {       
    @SuppressWarnings("rawtypes")
    Class amnClass = Class.forName("android.app.ActivityManagerNative");
    Object amn = null;
    Configuration config = null;

    // amn = ActivityManagerNative.getDefault();
    Method methodGetDefault = amnClass.getMethod("getDefault");
    methodGetDefault.setAccessible(true);
    amn = methodGetDefault.invoke(amnClass);

    // config = amn.getConfiguration();
    Method methodGetConfiguration = amnClass.getMethod("getConfiguration");
    methodGetConfiguration.setAccessible(true);
    config = (Configuration) methodGetConfiguration.invoke(amn);

    // config.userSetLocale = true;
    @SuppressWarnings("rawtypes")
    Class configClass = config.getClass();
    Field f = configClass.getField("userSetLocale");
    f.setBoolean(config, true);

    // set the locale to the new value
    config.locale = locale;

    // amn.updateConfiguration(config);
    Method methodUpdateConfiguration = amnClass.getMethod(
            "updateConfiguration", Configuration.class);
    methodUpdateConfiguration.setAccessible(true);
    methodUpdateConfiguration.invoke(amn, config);
}

您的申请需要获得许可:

android.permission.CHANGE_CONFIGURATION

对于api级别> = 17,您必须通过adb:

授予它
adb shell pm grant application_package android.permission.CHANGE_CONFIGURATION