2015-10-21 7 views
2

решение Java, это не проблема:Как программно отклонить (повесить) входящий звонок на Android в Delphi?

public boolean killCall(Context context) { 
    try { 
     // Get the boring old TelephonyManager 
     TelephonyManager telephonyManager = 
       (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 

     // Get the getITelephony() method 
     Class classTelephony = Class.forName(telephonyManager.getClass().getName()); 
     Method methodGetITelephony = classTelephony.getDeclaredMethod("getITelephony"); 

     // Ignore that the method is supposed to be private 
     methodGetITelephony.setAccessible(true); 

     // Invoke getITelephony() to get the ITelephony interface 
     Object telephonyInterface = methodGetITelephony.invoke(telephonyManager); 

     // Get the endCall method from ITelephony 
     Class telephonyInterfaceClass = 
       Class.forName(telephonyInterface.getClass().getName()); 
     Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("endCall"); 

     // Invoke endCall() 
     methodEndCall.invoke(telephonyInterface); 

    } catch (Exception ex) { // Many things can go wrong with reflection calls 
     Log.d(TAG,"PhoneStateReceiver **" + ex.toString()); 
     return false; 
    } 
    return true; 
} 

Но как сделать такое же решение в Delphi?

К сожалению, я не нашёл ни одного руководства, чтобы решить эту проблему.

+0

Прошу прощения, но почему вы не используете код Java? –

+2

@PedroLobito Потому что он делает свое развитие в Delphi, а не в Java? –

+0

Мне нужно это в одном приложении, которое написано (и должно быть) в Delphi. –

ответ

7

К сожалению, то, что вы просите в настоящее время не представляется возможным в Delphi кода непосредственно, из-за известной ошибки в рамках Android Bridge в Delphi:

QC#120233 Android Jlang_Class interface is missing 19 methods

QP #RSP-12686 Android Jlang_Class interface is missing 19 methods

getDeclaredMethod() является одним из отсутствующие методы, и без него вы не сможете получить доступ к интерфейсу ITelephony. Таким образом, вы просто должны написать, что часть вашего приложения в Java коде, обернуть его внутри .jar файл и импортировать в код Delphi в качестве внешнего API, в документации Embarcadero по:

Using a Custom Set of Java Libraries In Your RAD Studio Android Apps

Update : в Сиэтле, большинство отсутствующих методов теперь добавлено к Jlang_Class. Однако getDeclaredMethod() не один из них, но, к счастью getDeclaredMethods() был добавлен, так что вы должны быть в состоянии написать небольшую обертку для этого, например:

function getdeclaredMethod(Cls: Jlang_Class; const Name: JString): JMethod; 
var 
    Arr: TJavaObjectArray<JMethod>; 
    Meth: JMethod; 
    I: Integer; 
begin 
    Result := nil; 
    Arr := Cls.getDeclaredMethods; 
    for I := 0 to Arr.Length-1 do 
    begin 
    Meth := Arr.Items[I]; 
    if Meth.getName.compareTo(Name) = 0 then 
    begin 
     Result := Method; 
     Exit; 
    end; 
    end; 
    raise Exception.CreateFmt('method not found: %s', [Name]); 
end; 

И тогда вы можете сделать это:

function killCall(context: JContext): Boolean; 
var 
    obj: JObject; 
    telephonyManager: JTelephonyManager; 
    classTelephony: Jlang_Class; 
    methodGetITelephony: JMethod; 
    telephonyInterface: JObject; 
    telephonyInterfaceClass: Jlang_Class; 
    methodEndCall: JMethod; 
begin 
    try 
    // Get the boring old TelephonyManager 
    obj := context.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE); 
    telephonyManager := TJTelephonyManager.Wrap((obj as ILocalObject).GetObjectID); 

    // Get the getITelephony() method 
    classTelephony := TJlang_Class.JavaClass.forName(telephonyManager.getClass.getName); 
    methodGetITelephony := getDeclaredMethod(classTelephony, StringToJString('getITelephony')); 

    // Ignore that the method is supposed to be private 
    methodGetITelephony.setAccessible(True); 

    // Invoke getITelephony() to get the ITelephony interface 
    telephonyInterface := methodGetITelephony.invoke(telephonyManager); 

    // Get the endCall method from ITelephony 
    telephonyInterfaceClass := TJlang_Class.JavaClass.forName(telephonyInterface.getClass.getName); 
    methodEndCall := getDeclaredMethod(telephonyInterfaceClass, StringToJString('endCall')); 

    // Invoke endCall() 
    methodEndCall.invoke(telephonyInterface); 

    Result := True; 
    except 
    on E: Exception do // Many things can go wrong with reflection calls 
    begin 
     // 
     Result := False; 
    end; 
    end; 
end; 
+0

Ошибка была для XE-8. У меня есть DELPHI 10 SEATTLE. –

+0

У вас есть небольшая помощь для меня? Я попытаюсь, если ошибка находится в DELPHI 10 SEATTLE? –

+0

На самом деле, ошибка существует, поскольку Android был впервые добавлен в Delphi в XE5. У меня еще нет Сиэтла, но ошибка существует в XE8, поэтому не стоит предполагать, что она, вероятно, все еще существует в Сиэтле, тем более, что ошибка не сообщалась в QualityPortal до нескольких минут назад (мной), а Embarcadero отказался от QualityCentral в пользу QualityPortal, поэтому они, возможно, даже не видели отчет об ошибке исходного кода QC (этот билет все еще открыт). –

Смежные вопросы