Android 系统蓝牙 控制手机端音乐暂停 (AVRCP)



需求:Android 平板做为一个音响的功能使用。已经移植 BT 的 a2dp sink 的功能。现在需要加上 平板控制手机的声音播放,暂停,音量大小等功能


移植:
    
平台: rk3368 系统 android6.0 


    按网上的资料,http://blog.csdn.net/shichaog/article/details/52182987 。在 Android stdio 里移植,发现
import android.bluetooth.BluetoothAvrcpController;
import android.bluetooth.BluetoothAvrcp;
这两个 import 是找不到。查看源码,其实里面有的。网上查出原因,是因为用了 @hide 来隐藏,不暴露给app

于是想到在系统app 里尝试能否使用。

测试 在系统的源码里  package/app/Bluetooth 里的 src/com/android/bluetooth/a2dp/A2dpSinkStateMachine.java 加上
+import android.bluetooth.BluetoothAvrcpController;
+import android.bluetooth.BluetoothAvrcp;
     编译,能够通过。证明系统app 是可以调用的。
 
于是在 A2dpSinkStateMachine.java 加了一个 
+           mAvrcpController.sendPassThroughCmd(device, BluetoothAvrcp.PASSTHROUGH_ID_STOP, BluetoothAvrcp.PASSTHROUGH_STATE_PRESS);
+           mAvrcpController.sendPassThroughCmd(device, BluetoothAvrcp.PASSTHROUGH_ID_STOP, BluetoothAvrcp.PASSTHROUGH_STATE_RELEASE);
来暂停
 
那么问题来了,如何获取 mAvrcpController
 
看例子发现,需要一个 Listener
于是加了
 
 
+    private BluetoothProfile.ServiceListener mAvrcpServiceListener = new BluetoothProfile.ServiceListener(){
+        @Override
+        public void onServiceConnected(int profile, BluetoothProfile proxy) {
+        Log.d(TAG, "BT profile Service connected");
+            if (profile == BluetoothProfile.AVRCP_CONTROLLER){
+                Log.d(TAG, "AvrcpControllerService connected");
+
+                mAvrcpController = (BluetoothAvrcpController) proxy;
+//                mAvrcpController.setCallback(new AvrcpControllerCallback());
+
+                Log.d(TAG, "Avrcp devices: ");
+                List devices = mAvrcpController.getConnectedDevices();
+                for (BluetoothDevice device : devices)
+                    Log.d(TAG, " - " + device.getName() + " " + device.getAddress());
+            }
+        }
+
+        @Override
+        public void onServiceDisconnected(int profile) {
+            if (profile == BluetoothProfile.AVRCP_CONTROLLER) {
+                Log.d(TAG, "AvrcpControllerService disconnected");
+                //mAvrcpController.removeCallback();
+                mAvrcpController = null;
+            }
+        }
+    };
+


   然而程序进不了 onServiceConnected ,mAvrcpController 为空
   
   在framework 里加 log 发现 在 frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java 里的 BluetoothAvrcpController avrcp = new BluetoothAvrcpController(context, listener);出了错。怀疑是 服务没有启动。
   
12-12 21:02:16.207  1700  1700 D BluetoothAdapter: wade getProfileProxy12
12-12 21:02:16.207  1700  1700 D BluetoothAdapter: wade new BluetoothAvrcpController
12-12 21:02:16.210  1700  1700 E BluetoothAvrcpController: Could not bind to Bluetooth AVRCP Controller Service with Intent { act=android.bluetooth.IBluetoothAvrcpController }


  怎么启动 avrcp 的服务呢?没有想到很好的办法。比较以前有的一些补丁和源码。发现了问题。
  
--- a/packages/apps/Bluetooth/res/values/config.xml
+++ b/packages/apps/Bluetooth/res/values/config.xml
@@ -26,7 +26,7 @@
     false
     true
     true
-    false
+    true
     false
 
   在修改了这个之后,终于可以暂停手机端的音乐暂停了。
   
   
 总结:
    1. 编译要在源码里,编译系统app ,android stdio 用不了。
2. mAvrcpController 的获取需要加一个 BluetoothProfile.ServiceListener
3.系统本身要修改 config.xml 以打开 BluetoothAvrcpController 服务。
4. 只做到了一播放就暂停。关于场景的工作,(何时暂停,播放,或者按钮暂停播放没有做)

附所有的修改
app :
diff --git a/packages/apps/Bluetooth/res/values/config.xml b/packages/apps/Bluetooth/res/values/config.xml
index 0262064..57c8345 100644
--- a/packages/apps/Bluetooth/res/values/config.xml
+++ b/packages/apps/Bluetooth/res/values/config.xml
@@ -26,7 +26,7 @@
     false
     true
     true
-    false
+    true
     false
 
     

你可能感兴趣的:(android)