11

ICS で発信通話を切断したい。

私の問題は、まず第一に、Gingerbread の IC でブロードキャストを取得していないことです。正常に動作し、通話をブロックしていますが、ICS ではブロードキャストではありません。

BroadCast 用にサービスを作成し、ICS でも BroadCast を取得していPHONE_STATEますが、通話を切断しようとするとエラーが発生します

NO such method name 'getITelephony'

ICSコールで切断されていません。

次のコードを使用して、BroadCast を使用して通話を切断しています...

try{
       TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
       Class c = Class.forName(manager.getClass().getName());
       Method m = c.getDeclaredMethod("getITelephony");
       m.setAccessible(true);
       ITelephony telephony = (ITelephony)m.invoke(manager);
       telephony.endCall();
  } catch(Exception e){
       Log.d("",e.getMessage());
  }

AndroidMaifest.xml

PhonecallStateBroadcastReceiver.java

のパッケージ名でpackage com.android.internal.telephony;

ITelephony.aidl

interface ITelephony 
{
    boolean endCall();
    void answerRingingCall();
    void silenceRinger();
}
4

3 に答える 3

2

1) このクラスをダウンロードします: ITelephony

2) この class.java をプロジェクトのパッケージに追加します: com.android.internal.telephony

3) マニフェストにこのアクセス許可を追加します。

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />

そして、アプリケーション balise のこの受信機:

<receiver android:name=".CallReceiver" >
   <intent-filter>
     <action android:name="android.intent.action.PHONE_STATE" />
   </intent-filter>
</receiver>

4) CallReceiver クラスを作成します。

@Override
public void onReceive(Context context, Intent intent) {
    ITelephony telephonyService = getTeleService(context);
    if(telephonyService!=null) {
        try {
            String numberCall = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Log.i("TAG", "CALL NUM: " + numberCall);
            if(numberCall.equals(TEST_NUMBER)) {
                telephonyService.endCall();
                Toast.makeText(context, "END CALL: " + numberCall, Toast.LENGTH_LONG).show();
                Log.i("TAG", "END CALL");
            } else {
                Log.i("TAG", "ACCEPT CALL");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.i("TAG", "CATCH CALL");
        }
    }
}

private ITelephony getTeleService(Context context) {
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    try {
        Method m = Class.forName(tm.getClass().getName()).getDeclaredMethod("getITelephony");
        m.setAccessible(true);
        return (ITelephony) m.invoke(tm);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
于 2013-05-17T19:25:13.310 に答える
1

"getITelephony" へのアクセスを取得するためのリフレクションの使用は、Android 2.3 以降では機能しません。

参照:

http://hive-mind.org/android-call-blocking

2.3+ で通話をプログラムで終了するにはどうすればよいですか?

于 2013-04-11T10:19:01.527 に答える
0

Class c = Class.forName("android.telephony.TelephonyManager"); これにより、Android 2.3以降の問題が解決します

于 2014-01-13T09:47:11.880 に答える