2017-11-06 9 views
0

내 xamarin 네이티브 응용 프로그램을 통해 장치 언어를 변경하고 싶습니다. 안드로이드 스튜디오에서 다음 코드를 사용하여 쉽게이 작업을 수행 할 수 있습니다.xamarin에 해당하는 "Android.App.ActivityManagerNative"클래스는 무엇입니까?

public static void changeLanguage() 
     throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, 
     IllegalArgumentException, 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); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 
     // getConfiguration moved from ActivityManagerNative to ActivityManagerProxy 
     amnClass = Class.forName(amn.getClass().getName()); 
    } 


    // 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); 

    Locale locale = new Locale("zh", "CN"); 

    // 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); 
} 

저는 Xamarin을 통해 동일한 작업을 수행하려고합니다. 그러나 xamarin에서는 아래 오류가 발생합니다.

Caused by: java.lang.ClassNotFoundException: Didn't find class "Android.App.ActivityManagerNative" 

같은 목적을 달성하기 위해 내가 사용할 수있는 수업을 알려주십시오.

+0

내 코드를 C#으로 변환하려고 시도했는데 내 mono.Android 버전이 4.0.30319, VS 2017, jdk 1.8.0_144, 컴파일 대상 : Android 8.0, 테스트 된 장치 : Android에서 에뮬레이터로이 문제를 재현하지 못했습니다. 7.0. 하지만 같은 문제가 있었 네이티브 자바 안드로이드와 다른 사람을 발견, 그는이 문제를 우회 빌드 경로 가짜 클래스를 만들었지 만,이 문제를 재현 할 수 없기 때문에,이 솔루션이 도움이되는지 잘 모르겠습니다. –

+0

안녕하세요, 문제를 재현 할 수 없다면 Xamarin으로 작성된 코드에서 장치 언어를 변경할 수 있다는 의미입니까? – Sarfaraz

+0

필자는 그 코드를 테스트하지 않았고 코드의 마지막 줄에서 문제를 만났으며 권한이 없다고 제안하고 매니페스트에 사용 권한을 추가했지만 조사한 후에이 메서드를 사용하면 응용 프로그램은 시스템 응용 프로그램으로 설치해야합니다, 나는 그것을 설치하지 않았지만 코드는 내 편이 낫습니다. –

답변

1

어디에서 잘못 됐는지 안내해주세요. 아니면 저와 함께 프로젝트를 공유 할 수 있습니까?

var amnClass = Java.Lang.Class.ForName("android.app.ActivityManagerNative"); 
Java.Lang.Object amn = null; 
Configuration config = null; 

var methodGetDefault = amnClass.GetMethod("getDefault"); 
methodGetDefault.Accessible = true; 
amn = methodGetDefault.Invoke(amnClass); 

if (Build.VERSION.SdkInt >= Build.VERSION_CODES.O) 
{ 
    amnClass = Java.Lang.Class.ForName(amn.Class.Name); 
} 

var methodGetConfiguration = amnClass.GetMethod("getConfiguration"); 
methodGetConfiguration.Accessible = true; 
config = methodGetConfiguration.Invoke(amn) as Configuration; 

var configClass = config.Class; 
var f = configClass.GetField("userSetLocale"); 
f.SetBoolean(config, true); 

Locale locale = new Locale("zh", "CN"); 

config.Locale = locale; 

var methodUpdateConfiguration = amnClass.GetMethod("updateConfiguration", Java.Lang.Class.FromType(typeof(Configuration))); 
methodUpdateConfiguration.Accessible = true; 
try 
{ 
    methodUpdateConfiguration.Invoke(amn, config); 
} 
catch (InvocationTargetException ee) 
{ 
    var error = ee.TargetException; 
} 

그리고 여기 내 demo입니다 :

여기 내 코드입니다.

+0

Xamarin Android.App.ActivityManagerNative를 사용하고있었습니다. 하지만 안드로이드 SDK의 클래스를 사용해야했습니다. 그것은 나를 위해 지금 일합니다. 고마워. – Sarfaraz