当使用以下代码建立电话时,我正通过附件设置扬声器:
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
此代码打开扬声器,但不会在GUI上启用扬声器按钮。 这是正常的,还是我在这里遗漏了什么?
答案 0 :(得分:2)
我想您忘了添加所需的权限。
在清单中添加:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
答案 1 :(得分:0)
如果可以修改Android本机代码。 您可以更改android \ packages \ services \ Telecomm \ src \ com \ android \ server \ telecom \ TelecomSystem.java
在其中添加一些代码:
--- a/LINUX/android/packages/services/Telecomm/src/com/android/server/telecom/TelecomSystem.java
+++ b/LINUX/android/packages/services/Telecomm/src/com/android/server/telecom/TelecomSystem.java
@@ -43,6 +43,8 @@ import android.telecom.PhoneAccountHandle;
import java.io.FileNotFoundException;
import java.io.InputStream;
+import android.telecom.CallAudioState;
+import android.media.AudioManager;
/**
* Top-level Application class for Telecom.
@@ -80,6 +82,9 @@ public class TelecomSystem {
private static final IntentFilter BOOT_COMPLETE_FILTER =
new IntentFilter(Intent.ACTION_BOOT_COMPLETED);
+ private static final IntentFilter SPEAKE_CHANGE_FILTER =
+ new IntentFilter(AudioManager.ACTION_SPEAKERPHONE_STATE_CHANGED);
+
/** Intent filter for dialer secret codes. */
private static final IntentFilter DIALER_SECRET_CODE_FILTER;
@@ -116,6 +121,7 @@ public class TelecomSystem {
private final TelecomServiceImpl mTelecomServiceImpl;
private final ContactsAsyncHelper mContactsAsyncHelper;
private final DialerCodeReceiver mDialerCodeReceiver;
+ private AudioManager audioManager ;
private boolean mIsBootComplete = false;
@@ -167,6 +173,35 @@ public class TelecomSystem {
}
};
+ //change incallui accept call to speaker mode
+ private final BroadcastReceiver mSpeakerChangeReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if(intent.getAction().equals(AudioManager.ACTION_SPEAKERPHONE_STATE_CHANGED)){
+ try {
+ synchronized (mLock) {
+ mIsBootComplete = true;
+ if(audioManager!=null){
+ if(audioManager.isSpeakerphoneOn()){
+ Log.d("TelecomSystem","AudioManager.isSpeakerphoneOn true");
+ mCallsManager.setAudioRoute(CallAudioState.ROUTE_SPEAKER,null);
+ }else{
+ Log.d("TelecomSystem","AudioManager.isSpeakerphoneOn false");
+ }
+ }else{
+ Log.d("TelecomSystem","audioManager==null");
+ }
+ }
+ }catch(Exception e){
+ Log.d("TelecomSystem","mSpeakerChangeReceiver error:");
+ e.printStackTrace();
+ } finally {
+ }
+ }
+ }
+ };
+
public static TelecomSystem getInstance() {
return INSTANCE;
}
@@ -291,6 +326,7 @@ public class TelecomSystem {
roleManagerAdapter);
mIncomingCallNotifier = incomingCallNotifier;
+ audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
incomingCallNotifier.setCallsManagerProxy(new IncomingCallNotifier.CallsManagerProxy() {
@Override
public boolean hasUnholdableCallsForOtherConnectionService(
@@ -319,6 +355,7 @@ public class TelecomSystem {
mContext.registerReceiver(mUserSwitchedReceiver, USER_SWITCHED_FILTER);
mContext.registerReceiver(mUserStartingReceiver, USER_STARTING_FILTER);
mContext.registerReceiver(mBootCompletedReceiver, BOOT_COMPLETE_FILTER);
+ mContext.registerReceiver(mSpeakerChangeReceiver, SPEAKE_CHANGE_FILTER);
mBluetoothPhoneServiceImpl = bluetoothPhoneServiceImplFactory.makeBluetoothPhoneServiceImpl(
mContext, mLock, mCallsManager, mPhoneAccountRegistrar);