【问题标题】:Android AudioManager.setSpeakerphoneOn() does not change speaker button stateAndroid AudioManager.setSpeakerphoneOn() 不会改变扬声器按钮状态
【发布时间】:2014-06-09 19:33:52
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为这是电话应用程序中的经典错误。
  • @Dusan,你知道如何摆脱这辆公共汽车吗?
  • 有关于这个问题的消息吗?
  • @LuSchink,没有消息。

标签: android android-audiomanager


【解决方案1】:

我想你忘了添加所需的权限。

将此添加到您的清单中:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

【讨论】:

  • 我已经添加了这个权限。正如我所说,代码打开扬声器。问题是用户没有任何来自 GUI 的反馈,因为扬声器按钮未启用。
  • 我无法访问按钮代码,因为它是 android 原生的。一旦建立电话呼叫,此按钮就可用。
【解决方案2】:

如果可以修改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);

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多