2013-07-02 21 views
1

Java開發人員爲了結束傳入呼叫而使用了反射來達到ITelephony的endcall方法,直到2.3,但此方法後來被阻止,因此無法通過monodroid中的c#訪問。如何結束Monodroid的來電?

有沒有辦法在'Mono For Android'中做到這一點?

回答

6

Java開發人員曾使用反射

這是-同剛剛的不同:不是Java反射,你會使用JNIEnv

假設你想將這個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); 
+0

謝謝你,我最後在研究JNIEnv - 在問這個問題之後 - 但是我跳過了調用getITelephony的過程,當我看到你的答案時希望這就是爲什麼我不能訪問endCall ...不幸的是,它仍然給「沒有這樣的方法錯誤」endcall線......最好的問候。 –

+0

我還添加了[ITelephony.java](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/com/android/internal/telephony /ITelephony.java)作爲AndroidJavaSource ...既沒有幫助也沒有幫助 –

+0

哦好吧...得到它...問題是與類型引用。 endCall是()Z不(V)Z,我們也必須使用CallBooleanMethod ... –