2012-04-07 7 views
11

Android 2.2まで私はリフレクションを使用し、getITelephonyを通して呼び出しを終了できることを知っています。アプリにMODIFY_PHONE_STATEの権限を付与しても、それはシステムアプリになりまし権限だけだからプログラムで2.3以上でコールを終了するにはどうすればよいですか?

しかし、2.3のように、この動作しなくなります: 言っhttps://stackoverflow.com/a/5095956/821423

、それが可能だ、まだ理由は無数の用途GoogleでICSにうまくそれをやっている市場を果たし、例えば、この1:

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

は、そこで問題は、彼らはそれを行うのですか、ですか?私は、ヘッドセットのフックをシミュレートしてコールをピックアップできることは分かっていますが、コールを終了する方法を理解することはできません。

ありがとうございます。

答えて

18

多くのソウル・サーチの後、私は何かを本当に、本当に、本当にばかなことを実現します。プラス側では、StackOverflowの誰もそれに気づいていないようだ。 2.3 +以降、MODIFY_PHONE_STATEはsilenceRinger()で動作しなくなりましたが、endCallは問題ありません。

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

私はちょうどこれに1週間を過ごしたと信じられません!私は他の質問を更新しようとしています。それは、「これ以上呼び出しを終了させるためにリフレクションを使用することはできません」という行に沿ってSOのトンであるようです。

+0

あなたが意味する、私たちは、STILプログラム的に呼び出しを受け入れ、拒否することITelephony.aidl技術を使用することができますが、それだけでは動作しません。無声音?それから、唯一の解決策は、aidlファイルのsilenceRingerにコメントすることです。 Plsは、あなたがこれを発見したことで、この技術を新しいアプリケーションの設計に利用できるようになると示唆しています。 –

+0

2.3.6では、iTelephonyを使用したendCall()がそれを行います。アクセス権の問題を引き起こすのは本当にsilenceRinger()です。実際のコードでsilenceRinger()をコメントするだけで、AIDLをそのままにしておくことができます。私は1.5から2.2でこれをテストしていないが、まもなくそうしようとしている。このページでお知らせします。 –

+0

うわー...私は実際にコード内でendCall()を持っていましたが、if文のためにヒットしませんでした。私は、APIが無効になっているため、機能していないと仮定しました。 Googleがこの問題を修正しないように、あなたの回答にフラグを立てたいと思っています! :) +1 – you786

3

call()、endcall()関数は私にとってもうまく機能します。しかし、iTelephony.aidlを使わないともう一つの方法があります。この投稿に掲載されています。ところで、私はGoogleがすでに知っていると思うが、何らかの理由で彼らは機能の残りの部分で何かをしてしまうのではないかと思う。

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

+0

ブログでは、現在ブロックされています。 – George

1

プライベートボイド[終了](最終文字列cutofftime){

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(); 
    } 

} 
関連する問題