11

Android 2.2までは、リフレクションを使用してgetITelephonyを介して通話を終了できることを知っています。

ただし、2.3以降、アプリにMODIFY_PHONE_STATE権限を付与した場合でも、システムアプリのみの権限になっているため、これは機能しなくなりました: https ://stackoverflow.com/a/5095956/821423

とは言うものの、グーグルプレイマーケットの無数のアプリケーションがICSでうまくやっているので、それはまだ可能です、例えば、これは:

https://play.google.com/store/apps/details?id=com.androminigsm.fscifree&hl=en

だから問題は、彼らはそれをどのように行うのかということです。ヘッドセットフックをシミュレートして通話に応答できることはわかっていますが、通話を終了する方法がわかりません。

ありがとうございました。

4

3 に答える 3

16

よくよく考えてみた結果、本当に、本当に、本当にばかげたことに気づきました。プラス面としては、StackOverflow の誰もそれに気づいていないようです。MODIFY_PHONE_STATE は、2.3+ 以降、silenceRinger() で動作しなくなりましたが、endCall は問題ありません。

したがって、解決策は、silenceRinger() の呼び出しをコメント アウトすることです。

これに一週間費やしたなんて信じられない!SOには「リフレクションを使用して通話を終了することはできません」という行に沿って大量のだまされているように見えるため、他の質問を更新しようとします。

于 2012-04-07T21:17:25.467 に答える
3

call() 、 endcall() 関数もうまく機能します。しかし、iTelephony.aidl を使用せずに機能する別の方法もあります。この投稿で公開されています。ところで、Googleはすでに知っていると思いますが、何らかの理由で残りの機能について何もしていません。これは良いことです!!!

http://androidbridge.blogspot.com/2011/05/how-to-answer-incoming-call-in-android.html

于 2012-07-28T20:20:36.243 に答える
1

private void endCall(最終文字列カットオフタイム) {

TelephonyManager telephony = (TelephonyManager) srvs
            .getSystemService(Context.TELEPHONY_SERVICE);
    Class c;
    final com.android.internal.telephony.ITelephony telephonyService;
    try {
        c = Class.forName("android.telephony.TelephonyManager");//telephony.getClass().getName());
        Log.i("TelephonyClass Name", telephony.getClass().getName());
        Method m = c.getDeclaredMethod("getITelephony");
        m.setAccessible(true);
        telephonyService = (ITelephony) m.invoke(telephony);
        TimerTask task = new TimerTask() {

            @Override
            public void run() {
                try {
                    if (telephonyService.isIdle()
                            || telephonyService.isOffhook()
                            || telephonyService.isRinging())
                        telephonyService.endCall();
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        long delay = Integer.parseInt(cutofftime) * 1000;
        new Timer().schedule(task, delay);
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
于 2014-01-13T10:50:02.243 に答える