如何结束Monodroid的来电?

时间:2013-07-02 13:40:39

标签: c# android xamarin.android phone-call telephonymanager

Java开发人员使用反射来实现ITelephony的endcall方法直到2.3,以便结束传入呼叫,但此方法已被阻止,因此在monodroid中无法通过c#访问它。

有没有办法在'Mono For Android'中做到这一点?

1 个答案:

答案 0 :(得分:7)

  

Java开发人员使用了反射

这是相同的 - 只是不同的:你使用JNIEnv而不是Java反射。

假设您要移植此Java reflection-based code

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