Articles of android bluetooth

Android 4.4.4 Moto G蓝牙LE重新连接问题

我有一个应用程序,在运行Android 4.3的三星S3上效果很好,但是我在运行4.4.4的Moto G上遇到了问题 我的BLE外围设备在应用程序使用期间连接和断开多次。 这工作正常,但有时有一个点,应用程序/手机不再重新连接到外设。 所有的gatt命令都在主线程上运行,例如。 final BluetoothGatt gat = gatt; Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { // This code will be executed on the main thread if (Looper.myLooper() == Looper.getMainLooper()) { Log.e(TAG, "mGattCallback disconnect2: NOW ON MAIN THREAD :)"); } gat.disconnect(); } }); 和外设断开罚款。 当发生这种情况,我不能重新连接到外设了,我得到这样的日志负载: 04-07 16:57:56.798: […]

以编程方式连接到配对的蓝牙扬声器并播放audio

在我们的应用程序中,我想连接到以前配对的A2DP蓝牙扬声器,并使用Android v4.2或更高版本直接播放audio。 我可以使用以下代码成功创build一个A2DPconfiguration文件对象来启动该过程: /* Manifest permissions */ <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> // Get the default adapter BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // Establish connection to the proxy. mBluetoothAdapter.getProfileProxy(this, mProfileListener, BluetoothProfile.A2DP) 以及下面的监听器响应连接: private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() { public void onServiceConnected(int profile, BluetoothProfile proxy) { if (profile == BluetoothProfile.A2DP) { mBluetoothSpeaker = (BluetoothA2dp) proxy; // no […]

如何区分Android中编程连接的蓝牙设备?

无论是蓝牙耳机还是手机? 如何在android代码中区分bluetooth headset和bluetooth enabled android设备。 我正在开发一个小应用程序,因为我有一个通过蓝牙阻止数据传输的function,但它需要通过蓝牙耳机进行通信。 我提到的例子和代码,他们build议我只配对/取消配对蓝牙设备。 Android:如何以编程方式配对蓝牙设备? or else 获取所有连接的设备。 在Android中,如何获取连接的蓝牙设备的configuration文件? 是否可以在与设备连接types有关的设备中获得任何广播消息? 请帮助我区分连接的蓝牙设备为耳机/ Android设备(手机)等。 先谢谢你。

Android BLE近距离通知

我一直在开发一个与BLE设备交互的应用程序。 一切都很好,我可以扫描,连接和使用服务。 我一直在阅读所有的文档,我没有看到任何让开发者select收听BLE设备的选项。 基本上我想在设备进入BLE设备的范围时触发广播接收机。 我知道我可以不断地扫描这个,但电池使用太高,我希望这个被调用,即使当我的应用程序不被使用。 这个function是不支持的还是我错过了讨论这个文档的一部分?

如何在RecyclerView.Adapter中从ViewHolder调用MainActivity方法?

在GitHub的一个简单的应用程序项目中,我只有两个自定义的Java文件: MainActivity.java包含蓝牙和UI相关的源代码 DeviceListAdapter.java包含一个Adapter和ViewHolder用于在RecyclerView显示蓝牙设备 MainActivity.java包含一个方法,当用户在RecyclerView的蓝牙设备上点击时: public void confirmConnection(String address) { final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("Do you want to pair to " + device + "?"); builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { device.createBond(); } }); builder.setNegativeButton(R.string.button_cancel, null); builder.show(); } 在ViewHolder类中(在DeviceListAdapter.java中 ),定义了点击侦听器: public class DeviceListAdapter extends RecyclerView.Adapter<DeviceListAdapter.ViewHolder> […]

我如何启用Lollipop中引入的新的蓝牙A2DP接收器function?

我正在尝试修改Nexus 5的AOSP安卓图像,以包含对蓝牙A2DP接收器的支持。 我发现Google很好,可以包含Nexus 5的隐藏构build目标。 https://android.googlesource.com/device/lge/hammerhead/+/android-5.0.1_r1/car_hammerhead.mk 这包括修改的Bluedroidconfiguration文件,允许设备通过蓝牙广告A2DP Sink服务。 它还将设备类别更改为Bluetooth Automative Carkit,并修改Bluetooth.apk的configuration以支持A2DP接收器和AVRCP控制服务。 这使我得到了大约75%的路程。 我通过抓取一个KitKat手机并与Nexus 5上的修改版本进行配对来testing这一点。它正确地宣传了A2DP Sink服务,并允许我的KitKat手机连接到A2DP Sink服务。 从KitKat手机看来,它甚至允许我将音乐stream式传输到Nexus 5.但Nexus 5从来没有听到过音乐。我甚至在Nexus 5上捕捉到了HCIstream量,并发现这些音乐实际上正在stream向电话。 问题是蓝牙设备接收到audiostream,但是audio从不路由到扬声器。 有没有人有任何想法如何将A2DPstream路由到Nexus 5的扬声器?

在外部蓝牙设备和Android手机之间stream式传输audio

我正在考虑构build一个Android应用程序,允许通过蓝牙将audiostream式传输到Android手机。 我之前读过了Stackoverflow的类似问题,根据我的理解,不能使用A2DP,因为Android不能成为A2DP接收器。 理论上,我相信像HFP或HFP AG这样的configuration文件应该允许双向audiostream。 在Android API中,是否有办法强制蓝牙配对来跟踪这个configuration文件,还是操作系统决定使用哪个configuration文件(例如只有在打电话时强制使用HFP)?

蓝牙LE扫描有时不会查找设备

我正在扫描蓝牙LE设备并作为外围设备(在Moto G 2nd Gen上运行Android 6.0) 我遇到的问题是,有时(随机看起来,但经常),它不会find我的任何其他外围设备,其他时间工作正常。 我有一个运行相似代码的伴侣iOS设备(既可以扫描外围设备,也可以作为外设),当Android扫描找不到iOS设备时,我的iOS会发现Android设备充当外设。 所以似乎只是在事物的扫描方面存在问题。 这不仅仅是找不到我的伴侣iOS设备,而是没有find任何蓝牙设备。 当它工作,它发现我的伴侣iOS设备以及一堆其他设备。 我曾尝试过,没有ScanFilters,并得到同样的问题。 我正在build立一个最低SDK为23的SDK 26。 我正在设置所需的权限,因为它有时会起作用。 相关代码如下: private void startScanning() { mHandler = new Handler(mContext.getMainLooper()); mHandler.postDelayed(new Runnable() { @Override public void run() { ScanSettings settings = new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .setReportDelay(0) .build(); mBluetoothLeScanner.startScan(null, settings, mScanCallback); } }, 1000); } private ScanCallback mScanCallback = new ScanCallback() { @Override public […]

蓝牙/ WiFi直接sockets的高级协议?

当你在Android上使用蓝牙或WiFi Direct时,在所有的握手结束时,你都会插上sockets。 使用TCP / IP,我们在套接字之上有一个数十亿的库,用于高级协议:HTTP,XMPP,IMAP等。由于这些库,我们可以处理更多的领域特定的抽象一个操作(例如,“下载这个文件”),以及由库处理的低级套接字pipe道。 问题 :对于任何高级协议,是否存在与通过Android的Bluetooth和/或WiFi Direct层生成的套接字相同的已知工作(或可能工作)? 现在,我并不关心具体的协议 – 我只是寻找这种协议层的例子,使开发人员更容易使用这些连接选项。 例如,看起来我可以为OkHTTP创build一个fork或add-on,它使用一个替代的套接字源,而且我可以创build一个相同的Java HTTP服务器。 鉴于这些,应用程序开发人员将编写通过蓝牙或WiFi Direct进行交谈的HTTP应用程序(至less在客户端,一旦特定于连接的配对和握手进行,编码应该是相当“自然”的)。 IOW,回到处理原始sockets感觉如此二十年前… 🙂 谢谢! UPDATE 根据Kristopher Micinski对ZeroMQ答案的评论,我认为可能需要一些澄清。 说我不想要的东西比较容易:创build它们之后,我不想触摸套接字。 更高一层的东西应该为我处理这些东西,另外还要处理我认为是“协议”的东西(例如,确定某个通信操作何时结束,而不是套接字closures)。 大多数情况下,这是为我的书。 大多数低级套接字的书籍例子是不切实际的,例如“我们打开一个套接字到服务器,并立即开始爆炸代表一些图像上传的字节,然后closures套接字,当我们完成”。 虽然这些例子有效,但是在现实生活中你永远不会写这样的东西: 如果你真的在套接字层面上工作,那么即使你自己动手协议,你也会实现一些协议来解决authentication,error handling等问题 很less有开发人员现在可以直接使用套接字进行互联网操作 现在,如果图层提供的协议是开发人员习惯的(例如,HTTP)或者即使他们没有使用它(例如XMPP),也会很酷。 我会解决简单的情况(例如,N方式支持很酷,但不是必要的)。 在这方面,基于初步研究(由睡眠不足的大脑进行),ZeroMQ不是一个坏的select。 相比于可以使用任意套接字的XMPP协议栈,它缺乏一点“品牌识别”。 但是,袖口似乎满足了我正在寻找的东西。 我认识到这些堆栈将会受到底层传输的限制(例如,蓝牙只适用于N值较小的N路)。 我当然不想在这里或在我的书中描述任何我所描述的解决scheme,就是基于套接字的通信的全部和terminal。 我只是想要有一个更实际的祈祷的实际使用的东西。 奖励点数,如果它是我可以帮忙的,因为我一直使用TCP / IP通信的更高级别的协议,所以我对直接套接字操作的经验很短。

旧SDK版本中的java.lang.NoClassDefFoundError

我向Google Play发布了我的应用程序版本,并于今天早上与一些不满意的客户一起醒来。 该应用程序的最新版本集成了对蓝牙低功耗(BTLE)心率监视器的支持。 该应用程序在Android 4.3和4.4上运行良好,但在4.0,4.1和4.2上崩溃,出现以下错误。 FATAL EXCEPTION: main java.lang.NoClassDefFoundError: com.eiref.boatcoach.MainActivity at com.eiref.boatcoach.WhatToDo.onClick(WhatToDo.java:274) at android.view.View.performClick(View.java:4204) at android.view.View$PerformClick.run(View.java:17355) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:152) at android.app.ActivityThread.main(ActivityThread.java:5132) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) 在类似于以下内容的简单Onclick中创build一个Intent时发生该错误… public void onClick(View v) { Intent i = new Intent(this, MainActivity.class); startActivity(i); } 在淘汰购买4.2平板电脑后,我可以复制这个问题,我得出的结论是,这个新版本的应用程序支持蓝牙LE,它在SDK 4.3及更高版本中启用。 如果我在MainActivity中删除所有对蓝牙的引用,那么4.2和更早版本的设备会崩溃。 我从阅读文档的理解是,人们可以编写一个包含蓝牙LEfunction的应用程序,它可以在较旧的设备上运行,只要有人注意不要使用类似于以下内容的BTLE代码执行… if […]