0

icoming CALL で DTMF コードを送信しようとしています。このために、Java リフレクションを使用してみます。

public void initialize(){
    ClassLoader classLoader = Dtmf.class.getClassLoader();
    final Class<?> classCallManager =           classLoader.loadClass("com.android.internal.telephony.CallManager");
    Method methodGetInstance = classCallManager.getDeclaredMethod("getInstance");
    objectCallManager = methodGetInstance.invoke(null);
    methodGetState = classCallManager.getDeclaredMethod(SEND_DTMF, char.class);
}


public boolean sendDtmf(char ch) {
        boolean result = false;
        if ( methodGetState != null) {
            try {
                Object res = methodGetState.invoke(objectCallManager, 
                        new Object[]{Character.valueOf(ch)});

                if (res instanceof Boolean) {
                    result = ((Boolean) res).booleanValue(); 
                }
            } catch (IllegalArgumentException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
        }
        return result;
    }

クラス CallManager のソース コードへのリンク : Call Manager のソース コード しかし、メソッド sendDtmf() で常に「false」になります。デバッグでは、コードは次に進みます:

 Object res = methodGetState.invoke(objectCallManager, 
                            new Object[]{Character.valueOf(ch)});

どうしたの?

4

1 に答える 1

1

アプリケーションがプラットフォーム証明書で署名されていない場合、従来のアプリはこれらのメソッドを実行できないため、メソッドは InvocationTargetException をスローする可能性があります (実行に必要なプラットフォーム アクセス許可が付与されません)。

つまり、例外をキャッチ (および無視) しているため、メソッドは false を返しています。

DTMF トーンを送信することは現在不可能であるため、Android イシュー トラッカーには未解決の問題 ( #1428 ) があります。

于 2015-05-16T16:58:05.227 に答える