The idea behind is to place a call and to listen to the phone state change to switch on the speaker when the call is established.
package com.danielthat.loudspeaker;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class Loudspeaker extends Activity {
Button mButton;
EditText mEdit;
TelephonyManager manager;
StatePhoneReceiver myPhoneStateListener;
boolean callFromApp=false; // To control the call has been made from the application
boolean callFromOffHook=false; // To control the change to idle state is from the app call
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_loudspeaker);
//To be notified of changes of the phone state create an instance
//of the TelephonyManager class and the StatePhoneReceiver class
myPhoneStateListener = new StatePhoneReceiver(this);
manager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE));
mEdit = (EditText)findViewById(R.id.editText1);
mButton = (Button) findViewById(R.id.button1);
mButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String phoneNumber = mEdit.getText().toString();
manager.listen(myPhoneStateListener,
PhoneStateListener.LISTEN_CALL_STATE); // start listening to the phone changes
callFromApp=true;
Intent i = new Intent(android.content.Intent.ACTION_CALL,
Uri.parse("tel:+" + phoneNumber)); // Make the call
startActivity(i);
}
});
}
// Monitor for changes to the state of the phone
public class StatePhoneReceiver extends PhoneStateListener {
Context context;
public StatePhoneReceiver(Context context) {
this.context = context;
}
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_OFFHOOK: //Call is established
if (callFromApp) {
callFromApp=false;
callFromOffHook=true;
try {
Thread.sleep(500); // Delay 0,5 seconds to handle better turning on loudspeaker
} catch (InterruptedException e) {
}
//Activate loudspeaker
AudioManager audioManager = (AudioManager)
getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
}
break;
case TelephonyManager.CALL_STATE_IDLE: //Call is finished
if (callFromOffHook) {
callFromOffHook=false;
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_NORMAL); //Deactivate loudspeaker
manager.listen(myPhoneStateListener, // Remove listener
PhoneStateListener.LISTEN_NONE);
}
break;
}
}
}
}
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.danielthat.loudspeaker" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.danielthat.loudspeaker.Loudspeaker" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".Loudspeaker" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Number to call with loudspeaker on:" /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:ems="10" android:inputType="phone" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editText1" android:layout_below="@+id/editText1" android:text="Call" /> </RelativeLayout>




