【问题标题】:Is there a AudioManager.MODE_IN_COMMUNICATION Bluetooth permission interaction?是否有 AudioManager.MODE_IN_COMMUNICATION 蓝牙权限交互?
【发布时间】:2014-02-20 10:22:36
【问题描述】:

我有一个非常简单的代码行:

audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);

但是,最近在 4.0+ 设备上,我看到由于这条线说它需要蓝牙权限而导致崩溃。

更准确地说,我看到的错误是:

java.lang.SecurityException: Need BLUETOOTH permission

在我的 setMode 行。

我有MODIFY_AUDIO_SETTINGS 权限,但是我看不到它如何与蓝牙交互,所以我正在寻找确认我是否真的需要 MODE_IN_COMMUNICATION 的 BLUETOOTH 权限

【问题讨论】:

    标签: android


    【解决方案1】:

    从逻辑上看,AudioManager 不可能使用蓝牙,因此需要android.permission.BLUETOOTH

    从源码来看,setMode()只需要android.permission.MODIFY_AUDIO_SETTINGS

    • AudioManager:1425

      public void setMode(int mode) {
          IAudioService service = getService();
          try {
              service.setMode(mode, mICallBack);
          } catch (RemoteException e) {
              Log.e(TAG, "Dead object in setMode", e);
          }
      }
      
    • AudioService:703

      public void setMode(int mode, IBinder cb) {
          if (!checkAudioSettingsPermission("setMode()")) {
              return;
          }
      
    • AudioService:1250

      boolean checkAudioSettingsPermission(String method) {
          if (mContext.checkCallingOrSelfPermission("android.permission.MODIFY_AUDIO_SETTINGS")
              == PackageManager.PERMISSION_GRANTED) {
          return true;
          }
      String msg = "Audio Settings Permission Denial: " + method + " from pid="
          + Binder.getCallingPid()
          + ", uid=" + Binder.getCallingUid();
          Log.w(TAG, msg);
          return false;
      }
      

    【讨论】:

    • 是的,我相信问题出在 OEM / 特殊版本的 Android 上。我现在放了一个陷阱。你完美地回答了我的问题,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2022-09-27
    • 2023-02-10
    • 2013-09-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2012-07-20
    相关资源
    最近更新 更多