Android電話の自動応答と切断の詳細

4590 ワード

1、aidlと反射によって電話を切るのは具体的に3つのステップに分けられる.
(1)ITelephony.aidl、comを新規作成する必要があります.android.internal.telephonyバッグをITelephonyに入れます.aidlファイル(構築後genの下にITelephony.javaファイルがあり、これはaidlが生成したインタフェースです).ファイルの内容は以下の通りです.
package com.android.internal.telephony;
interface ITelephony{
    boolean endCall();
    void answerRingingCall();
}
(2)必要なクラスに次のような方法を追加する(反射による電話インタフェースの取得例)
/**
     * @param context
     * @return
     */
    private static ITelephony getITelephony(Context context) {
        TelephonyManager mTelephonyManager = (TelephonyManager) context
                .getSystemService(TELEPHONY_SERVICE);
        Class c = TelephonyManager.class;
        Method getITelephonyMethod = null;
        try {
            getITelephonyMethod = c.getDeclaredMethod("getITelephony",
                    (Class[]) null);//宣言の取得方法
            getITelephonyMethod.setAccessible(true);
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        try {
            ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(
                    mTelephonyManager, (Object[]) null);//インスタンスの取得
            return iTelephony;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return iTelephony;
    }
(3)着信時にこのインスタンスを呼び出し,endCall()メソッドを呼び出す.
mTelephonyManager = (TelephonyManager) this
                .getSystemService(TELEPHONY_SERVICE);
        mTelephonyManager.listen(phoneStateListener,
                PhoneStateListener.LISTEN_CALL_STATE);
//電話例
PhoneStateListener phoneStateListener = new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
                case TelephonyManager.CALL_STATE_RINGING :
                    iTelephony = getITelephony(getApplicationContext());//電話インタフェースの取得
                    if (iTelephony != null) {
                        try {
                            iTelephony.endCall();//電話を切る
                            Toast.makeText(getApplicationContext(),
                                    "endCall "+ incomingNumber +"  successful!", 3000).show();
                        } catch (RemoteException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                default :
                    break;
            }
        }
    };
aidlダウンロードアドレス:http://download.csdn.net/detail/ab6326795/7993671
以上の方法はバージョン2.3以前のものに適用され、2.3以上のものは使用できません.
2、放送通知システムによる受話器と切断
なぜならAndroid 2.3以上に対するpermissionandroidが増加した.permission.MODIFY_PHONE_STATEの制限、2.3以前の反射メカニズムでITelephoneを呼び出す能力は適用されませんでした.2.3実装方法:public synchronized void answerringCall(){
クエリーシステムPhoneAPPアプリケーション(PhoneGlobals.java)は、イヤホン挿入、マルチメディアボタンなどの通知の受け入れと処理を実現した.この中には特別な点は発見されず,個人的には,システムがこのブロードキャストを受信すれば受信や切断操作が可能であると考えられる.
 // 2.3              
                    Intent mintent = new Intent(Intent.ACTION_MEDIA_BUTTON);
                    
                    //    
                    KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK);
                    mintent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);
                    //              ,           
                    mContext.sendOrderedBroadcast(mintent,"android.permission.CALL_PRIVILEGED");

                    mintent = new Intent(Intent.ACTION_MEDIA_BUTTON);
                    keyEvent = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);
                    mintent.putExtra("android.intent.extra.KEY_EVENT", keyEvent);

                    mContext.sendOrderedBroadcast(mintent,"android.permission.CALL_PRIVILEGED");

両方とも権限が必要です
    <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"/>

2つの方法を統合すれば、電話の自動応答と切断のアプリを作ることができます.