Android连接到配对的蓝牙耳机

时间:2011-05-28 13:16:38

标签: android bluetooth headset

我想模拟进入throgh Settings-> Wireless-> Bluetooth的动作并以编程方式连接配对的蓝牙耳机。我在Stackoverflow和Google上做了一些搜索,两者都表明在API级别11之前没有可用的解决方案。但是,我有兴趣通过窥视Android的蓝牙实现的源代码来解决它。问题是我不知道应该检查哪些具体的源代码。有什么建议?非常感谢。

4 个答案:

答案 0 :(得分:8)

经过几天的挣扎,我现在已经设法做到了,欢呼:)

  1. 在您的应用的/ src目录中添加android.bluetooth.IBluetoothA2dp.aidl;
  2. 在您的代码中添加此私有方法:

    private IBluetoothA2dp getIBluetoothA2dp() {
    
    IBluetoothA2dp ibta = null;
    
    try {
    
        Class c2 = Class.forName("android.os.ServiceManager");
    
        Method m2 = c2.getDeclaredMethod("getService", String.class);
        IBinder b = (IBinder) m2.invoke(null, "bluetooth_a2dp");
    
        Log.d("Felix", "Test2: " + b.getInterfaceDescriptor());
    
        Class c3 = Class.forName("android.bluetooth.IBluetoothA2dp");
    
        Class[] s2 = c3.getDeclaredClasses();
    
        Class c = s2[0];
        // printMethods(c);
        Method m = c.getDeclaredMethod("asInterface", IBinder.class);
    
        m.setAccessible(true);
        ibta = (IBluetoothA2dp) m.invoke(null, b);
    
    } catch (Exception e) {
        Log.e("flowlab", "Erroraco!!! " + e.getMessage());
    }
    
  3. 用此测试:

    private void testBluetoothA2dp(BluetoothDevice device) {
    // TODO Auto-generated method stub
    // TODO Auto-generated method stub
    IBluetoothA2dp ibta = getIBluetoothA2dp();
    try {
        Log.d("Felix", "Here: " + ibta.getSinkPriority(device));
        ibta.connectSink(device);
    } catch (RemoteException e) {
        // * TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    }

  4. 我无法提供这些代码的引用,因为我花了很多时间谷歌搜索,检查stackoverflow,并查看Android源代码,但未能跟踪来源。非常感谢Stackoverflow中的你们:)

答案 1 :(得分:2)

好的,我更新了这个以支持Honeycomb和更多。您需要向界面添加新功能。我在这做了:

interface IBluetoothA2dp {
boolean connectSink(in BluetoothDevice device); // Pre API 11 only
boolean disconnectSink(in BluetoothDevice device); // Pre API 11 only
boolean connect(in BluetoothDevice device); // API 11 and up only
boolean disconnect(in BluetoothDevice device); // API 11 and up only
boolean suspendSink(in BluetoothDevice device); // all
boolean resumeSink(in BluetoothDevice device); // all
BluetoothDevice[] getConnectedSinks();  // change to Set<> once AIDL supports, pre API 11 only
BluetoothDevice[] getNonDisconnectedSinks();  // change to Set<> once AIDL supports, 
int getSinkState(in BluetoothDevice device);
boolean setSinkPriority(in BluetoothDevice device, int priority); // Pre API 11 only
boolean setPriority(in BluetoothDevice device, int priority); // API 11 and up only
int getPriority(in BluetoothDevice device); // API 11 and up only
int getSinkPriority(in BluetoothDevice device); // Pre API 11 only
boolean isA2dpPlaying(in BluetoothDevice device); // API 11 and up only

}

然后,您需要在调用此界面中的函数之前检查API版本。这是我的例子:

            if (android.os.Build.VERSION.SDK_INT < 11) {

            IBluetoothA2dp ibta = getIBluetoothA2dp();
            try {
                Log.d(LOG_TAG, "Here: " + ibta.getSinkPriority(device));
                if (ibta != null)
                    ibta.connectSink(device);
            } catch (Exception e) {
                Log.e(LOG_TAG, "Error " + e.getMessage());
            }
        } else {
            IBluetoothA2dp ibta = getIBluetoothA2dp();
            try {
                Log.d(LOG_TAG, "Here: " + ibta.getPriority(device));
                if (ibta != null)
                    ibta.connect(device);
            } catch (Exception e) {
                Log.e(LOG_TAG, "Error " + e.getMessage());
            }
        }

希望这会有所帮助。我能够使用相同的应用程序来使用这两个界面。

答案 2 :(得分:2)

我在Android 4.2上试过这个 并且以下行返回null。 它正在研究4.1,任何想法?

IBinder b = (IBinder) m2.invoke(null, "bluetooth_a2dp");

答案 3 :(得分:-2)

这与连接/重新连接问题有关(ANSWER是苹果脚本)..

我刚买了一台Android htc一个V,并通过应用程序PdaNet将其用作热点(在我的手机和我的mac os 10.5.8 ppc笔记本电脑上安装)。

我似乎无法通过wifi或usb获得热点网络绑定,但它与BLUETOOTH一起工作得很好!唯一的问题是连接只持续2分钟到40分钟(现在看着它,记录)我必须手动重新连接,这只需要2秒但是如果我的mac的网络方面可能会很好自动重新连接。

我的手机不是问题,因为它发出一个恒定的信号(虽然我可能暂时从我的手机中丢失信号,这是正常的连接东西)..问题是让我的笔记本电脑自动重新连接。我的笔记本电脑和htc一个v保持配对,笔记本电脑端没有自动重新连接。

我希望我知道苹果脚本bcs然后我可能会写一个苹果脚本,自动重新连接丢失的蓝牙连接..或者一个小部件可以做到这一点?如果是这样的话,我会在阴影下制作它,因为蓝牙束缚正在工作。

我希望这可以帮助我自己和其他人寻找相同的答案..如果你保持这个线程打开我可以稍后返回一些可能的苹果脚本解决方案(我将不得不快速学习)..谢谢-marcus