web-dev-qa-db-ja.com

プログラムで着信を終了する

これはSOでよく知られている質問です。そして、私が必要なのは、プログラムで通話を終了することです。私はたくさん検索しました...

http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-Android.htmlhttp://androiddesk.wordpress.com/2012/08/02/ブロック中の呼び出しなしのユーザー介入介入-Android /

Androidで着信を拒否する

プログラムで通話に応答/終了する方法Android 4.1?

http://www.emoticode.net/Android-sdk/block-incoming-and-outgoing-phone-calls-programmatically.html

Androidで通話をブロックする方法

Androidアプリケーション開発? で携帯電話の通話とメッセージの受信をブロックする方法==

および http://androidsourcecode.blogspot.in/2010/10/blocking-incoming-call-Android.html

さらに多くの質問、回答、提案...

すべてが使用ITelephonyService.aidlTelephonyManager と組み合わせて

そして、ソリューションは多くのデバイスで完璧に機能していますが、Samsung S Duosでは機能しません。 1週間以上苦労していますが、解決策がありませんでした。このタイプのデバイスで使用できる特別なAPIはありますか?着信を拒否するにはどうすればよいですか?私を助けてください...

24

これが機能するのを確認してください。それは私にとってはうまくいきます。

ITelephony.Javaファイルは ITelephony.Java からダウンロードできます。

その後、呼び出しを終了するメソッドを追加します。

通話を切断する関数

public void disconnectCall(){
 try {

    String serviceManagerName = "Android.os.ServiceManager";
    String serviceManagerNativeName = "Android.os.ServiceManagerNative";
    String telephonyName = "com.Android.internal.telephony.ITelephony";
    Class<?> telephonyClass;
    Class<?> telephonyStubClass;
    Class<?> serviceManagerClass;
    Class<?> serviceManagerNativeClass;
    Method telephonyEndCall;
    Object telephonyObject;
    Object serviceManagerObject;
    telephonyClass = Class.forName(telephonyName);
    telephonyStubClass = telephonyClass.getClasses()[0];
    serviceManagerClass = Class.forName(serviceManagerName);
    serviceManagerNativeClass = Class.forName(serviceManagerNativeName);
    Method getService = // getDefaults[29];
    serviceManagerClass.getMethod("getService", String.class);
    Method tempInterfaceMethod = serviceManagerNativeClass.getMethod("asInterface", IBinder.class);
    Binder tmpBinder = new Binder();
    tmpBinder.attachInterface(null, "fake");
    serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder);
    IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone");
    Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class);
    telephonyObject = serviceMethod.invoke(null, retbinder);
    telephonyEndCall = telephonyClass.getMethod("endCall");
    telephonyEndCall.invoke(telephonyObject);

  } catch (Exception e) {
    e.printStackTrace();
    Log.error(DialerActivity.this,
            "FATAL ERROR: could not connect to telephony subsystem");
    Log.error(DialerActivity.this, "Exception object: " + e); 
 }
}
66
Jebasuthan

この機能を試してください:

 private void endCall() {
        Context context = getApplicationContext();
        try {
            TelephonyManager telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            Class<?> c = Class.forName(telephony.getClass().getName());

            Method m = c.getDeclaredMethod("getITelephony");
            m.setAccessible(true);

            ITelephony telephonyService = (ITelephony) m.invoke(telephony);

            // Funciona en 2.2
            // Funciona en 2.3.3
            telephonyService.endCall();

            logManager.debug("ITelepony was used (endCall)");
        } catch (Exception e) {
            logManager.error("Error ending call: " + e.getMessage());
            logManager.debug("Error ending call", e);
        }
    }