마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 invoke에러

0 추천

 

안드로이드 개발자 분들께 질문 드립니다.

해당 소스는 어플리케이션에서 시스템 언어를 변경하기 위한 코드 입니다.

저도 구글링해서 발견 했구요.

해당 코드를 디버깅 하면 맨 아랬줄 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();
}
 

 

서홍이 (200 포인트) 님이 2013년 5월 9일 질문

1개의 답변

0 추천

 

android.app.ActivityManagerNative 요 클래스는 히든 클래스입니다.

건들지 못하게 해놨다는게지요

참조해서 쓰시고 싶으시면 루팅해서 파일명 정확히 알아서 접근하거나(폰이나 패키지마다 뒤에 이름이 붙을겁니다.)

안드로이드 소스를 구해보시던가 하시면 되겠지만....

실험용일 뿐 출시용으로는 힘들겠죠 ~_~?

고또 (6,100 포인트) 님이 2013년 5월 10일 답변
...