안드로이드 개발자 분들께 질문 드립니다.
해당 소스는 어플리케이션에서 시스템 언어를 변경하기 위한 코드 입니다.
저도 구글링해서 발견 했구요.
해당 코드를 디버깅 하면 맨 아랬줄 methodUpdateConfiguration.invoke(amn, config); 에서
W/System.err(6005): java.lang.reflect.InvocationTargetException 와 같은 에러가 발생 합니다.
찾아보니 The solution is that when you are creating the object of the class use package name also along with class name so that compiler knows what class it has to use.
이 처럼 클래스를 생성 할때 패키지 명을 주라는데 무슨 뜻인가요?
전체 소스 코드 첨부 합니다.
try{
Locale locale = new Locale("fr");
Class amnClass = Class.forName("android.app.ActivityManagerNative");
Object amn = null;
Configuration config = null;
Method methodGetDefault = amnClass.getMethod("getDefault");
methodGetDefault.setAccessible(true);
amn = methodGetDefault.invoke(amnClass);
Log.e("HOLIC", String.format("amn = methodGetDefault.invoke(amnClass)") );
Method methodGetConfiguration = amnClass.getMethod("getConfiguration");
methodGetConfiguration.setAccessible(true);
config = (Configuration) methodGetConfiguration.invoke(amn);
Class configClass = config.getClass();
Field f = configClass.getField("userSetLocale");
f.setBoolean(config, true);
config.locale = locale;
Method methodUpdateConfiguration = amnClass.getMethod("updateConfiguration", Configuration.class);
methodUpdateConfiguration.setAccessible(true);
// 매니페스트에 android.permission.CHANGE_CONFIGURATION 추가해야함.
methodUpdateConfiguration.invoke(amn, config);
} catch(Exception e)
{
Log.e("HOLIC", String.format("error_fuck") );
e.printStackTrace();
}