0

I have to perform a task of creating an Android Application that will pick all the calls, play a pre-recorded voice to the other party and cut the phone. Is it possible?

Skeleton code is most welcome.

Bart
  • 19,692
  • 7
  • 68
  • 77
user189942
  • 17
  • 5

2 Answers2

0

No, you are not able to play back anything other way than via loud speaker. Therefore you will not be able to write "silent auto answering" app or anything like that. It is intentional I guess, to not let app "speak" in behalf of the user the way he will not know that

Marcin Orlowski
  • 72,056
  • 11
  • 123
  • 141
  • i did write a sample code, but don't know what the hell it's going to do.please check above code – user189942 Sep 07 '12 at 05:55
  • It is possible to play a tts sentence to the caller . that is a tested fact . (galaxy s 2 i9100 ) So letting the user enter the sentence is advised . – User 1234 Feb 22 '13 at 00:02
0

This is the code I did write:

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();
        }
}
Bart
  • 19,692
  • 7
  • 68
  • 77
user189942
  • 17
  • 5