1

Java 開発者は 2.3 までは ITelephony の endcall メソッドに到達するためのリフレクションを使用して着信を終了していましたが、このメソッドは後で防止されたため、モノドロイドでも c# 経由ではアクセスできません。

「Mono For Android」でそれを行う方法はありますか?

4

1 に答える 1

7

Java 開発者はリフレクションを使用していました

Java リフレクションの代わりにJNIEnvを使用します。

このJava リフレクション ベースのコードを移植するとします。

try {
    TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    Class c = Class.forName(manager.getClass().getName());
    Method m = c.getDeclaredMethod("getITelephony");
    m.setAccessible(true);
    ITelephony telephony = (ITelephony)m.invoke(manager);
    telephony.endCall();
} catch(Exception e){
    Log.d("",e.getMessage());
}

目を細める、次の (完全にテストされていない) C# コードを取得できます。

var manager = (TelephonyManager) this.GetSystemService (Context.TelephonyService); 

IntPtr TelephonyManager_getITelephony = JNIEnv.GetMethodID (
        manager.Class.Handle,
        "getITelephony",
        "()Lcom/android/internal/telephony/ITelephony;");

IntPtr telephony          = JNIEnv.CallObjectMethod (manager.Handle, TelephonyManager_getITelephony);
IntPtr ITelephony_class   = JNIEnv.GetObjectClass (telephony);
IntPtr ITelephony_endCall = JNIEnv.GetMethodID (
        ITelephony_class,
        "endCall",
        "()Z");
JNIEnv.CallBooleanMethod (telephony, ITelephony_endCall);
JNIEnv.DeleteLocalRef (telephony);
JNIEnv.DeleteLocalRef (ITelephony_class);
于 2013-07-09T02:26:47.027 に答える