在android中自动回答

时间:2012-09-06 10:43:50

标签: android

我必须执行创建Android应用程序的任务,该应用程序将选择所有呼叫,向对方播放预先录制的语音并切断电话。有可能吗?

最受欢迎的是骷髅代码。

2 个答案:

答案 0 :(得分:0)

不,你不能通过扬声器播放任何其他方式。因此,您将无法编写“静音自动应答”应用程序或类似的东西。这是故意我猜,不要让app代表用户“说话”他不会知道的方式

答案 1 :(得分:0)

这是我写的代码:

public class AutoAnswerIntentService extends IntentService {

        public AutoAnswerIntentService() {
                super("AutoAnswerIntentService");
        }

        @Override
        protected void onHandleIntent(Intent intent) {
                Context context = getBaseContext();

                // Load preferences
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
                BluetoothHeadset bh = null;
                if (prefs.getBoolean("headset_only", false)) {
                        bh = new BluetoothHeadset(this, null);
                }

                // Let the phone ring for a set delay
                try {
                        Thread.sleep(Integer.parseInt(prefs.getString("delay", "2")) * 1000);
                } catch (InterruptedException e) {
                        // We don't really care
                }

                // Check headset status right before picking up the call
                if (prefs.getBoolean("headset_only", false) && bh != null) {
                        if (bh.getState() != BluetoothHeadset.STATE_CONNECTED) {
                                bh.close();
                                return;
                        }
                        bh.close();
                }

                // Make sure the phone is still ringing
                TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
                if (tm.getCallState() != TelephonyManager.CALL_STATE_RINGING) {
                        return;
                }

                // Answer the phone
                try {
                        answerPhoneAidl(context);
                }
                catch (Exception e) {
                        e.printStackTrace();
                        Log.d("AutoAnswer","Error trying to answer using telephony service.  Falling back to headset.");
                        answerPhoneHeadsethook(context);
                }

                // Enable the speakerphone
                if (prefs.getBoolean("use_speakerphone", false)) {
                        enableSpeakerPhone(context);
                }
                return;
        }

        private void enableSpeakerPhone(Context context) {
                AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                audioManager.setSpeakerphoneOn(true);
        }

        private void answerPhoneHeadsethook(Context context) {
                // Simulate a press of the headset button to pick up the call
                Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);             
                buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
                context.sendOrderedBroadcast(buttonDown, "android.permission.CALL_PRIVILEGED");

                // froyo and beyond trigger on buttonUp instead of buttonDown
                Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);               
                buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
                context.sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");
        }

        @SuppressWarnings("unchecked")
        private void answerPhoneAidl(Context context) throws Exception {
                // Set up communication with the telephony service (thanks to Tedd's Droid Tools!)
                TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
                Class c = Class.forName(tm.getClass().getName());
                Method m = c.getDeclaredMethod("getITelephony");
                m.setAccessible(true);
                ITelephony telephonyService;
                telephonyService = (ITelephony)m.invoke(tm);

                // Silence the ringer and answer the call!
                telephonyService.silenceRinger();
                telephonyService.answerRingingCall();
        }
}