Android AudioManager.setSpeakerphoneOn()不会更改扬声器按钮状态

时间:2014-06-09 19:33:52

标签: android android-audiomanager

当使用以下代码建立电话时,我正通过附件设置扬声器:

audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);

此代码打开扬声器,但不会在GUI上启用扬声器按钮。 这是正常的,还是我在这里遗漏了什么?

2 个答案:

答案 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);