2017-11-06 5 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" 

私は同じクラスを達成するためにXamarinでどのクラスを使用できますか教えてください。

+0

あなたのコードをC#に翻訳しようとしましたが、私のmono.Androidバージョンは4.0.30319、VS 2017、jdk 1.8.0_144、コンパイル対象:Android 8.0、テスト済みデバイス:Android搭載エミュレータ7.0。しかし、私は同じ問題を抱えていたネイティブのJavaのアンドロイドを持つ他の人を見つけました。この問題を回避するために、ビルドパスに偽のクラスを作成しましたが、この問題を再現できませんでした。 –

+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を使用していました。しかし、私はAndroid SDKのクラスを使うことになっていました。それは今私のために働く。どうもありがとう。 – Sarfaraz

関連する問題