当前位置: 首页 > 知识库问答 >
问题:

Android-蓝牙发现找不到任何设备

方英耀
2023-03-14

我目前正在开发一个小应用程序,以开始使用蓝牙Android应用编程接口可以提供的服务。

编辑-

问题似乎是由特定的Nexus 5设备造成的。他们的蓝牙接收器好像不太好用。以下解决方案适用于其他设备

备注:

>

我已经完成了几乎所有我感兴趣的功能(例如检查适配器是否存在,启用/禁用蓝牙,查询成对的部分,设置适配器可发现)。

问题:

实际上,当我启动. onDiscovery()方法时,没有找到设备,即使在我的Nexus 5上的设置/蓝牙中找到了设备。

我是这样处理的:

public class MainActivity extends AppCompatActivity {
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

...

protected void onCreate(Bundle savedInstanceState) {
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, filter); 
}

就我所能尝试的而言,该过滤器运行良好,即操作状态已更改(启用蓝牙)和两个操作发现。

然后成功调用以下方法:

public void onDiscovery(View view)
{
    mBluetoothAdapter.startDiscovery();
}

还有我的蓝牙接收器:

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
            final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);

            if (state == BluetoothAdapter.STATE_ON) {
                showToast("ACTION_STATE_CHANGED: STATE_ON");
            }
        }

        else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            mDeviceList = new ArrayList<>();
            showToast("ACTION_DISCOVERY_STARTED");
            mProgressDlg.show();
        }

        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action) && !bluetoothSwitchedOFF) {
            mProgressDlg.dismiss();
            showToast("ACTION_DISCOVERY_FINISHED");

            Intent newIntent = new Intent(MainActivity.this, DeviceListActivity.class);

            newIntent.putParcelableArrayListExtra("device.list", mDeviceList);

            startActivity(newIntent);
        }

        else if (BluetoothDevice.ACTION_FOUND.equals(action)) {// When discovery finds a device
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            mDeviceList.add(device);
            showToast("Device found = " + device.getName());
        }
    }
};

我没有任何问题出来的日志,也没有注意到任何问题,在测试期间,我做了。唯一的问题是扫描结束时没有发现任何设备,而周围有许多可发现的设备。

我尽量不写太多代码,以免淹没这个话题。问我你是否需要更多。

感谢您阅读我的文章,并提前感谢您的回答。

共有2个答案

江华容
2023-03-14

派对有点晚了,但这可能对其他人有用。

你需要做两件事

  1. 添加

到你的Androidanifest.xml

请确保您正在请求运行时的权限以及Android 6.0设备通过使用这样的东西

int MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 1; 
ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
        MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);

就在mBluetoothAdapter.startDiscovery()之前;

如果你不做第2步,你将无法在Android设备上获得任何硬件标识符信息

更新/编辑:
以Android版本检查和警报对话框作为警告的示例

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  // Only ask for these permissions on runtime when running Android 6.0 or higher
    switch (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION)) {
        case PackageManager.PERMISSION_DENIED:
            ((TextView) new AlertDialog.Builder(this)
                    .setTitle("Runtime Permissions up ahead")
                    .setMessage(Html.fromHtml("<p>To find nearby bluetooth devices please click \"Allow\" on the runtime permissions popup.</p>" +
                            "<p>For more info see <a href=\"http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id\">here</a>.</p>"))
                    .setNeutralButton("Okay", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            if (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                                ActivityCompat.requestPermissions(DeviceListActivity.this,
                                        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                                        REQUEST_ACCESS_COARSE_LOCATION);
                            }
                        }
                    })
                    .show()
                    .findViewById(android.R.id.message))
                    .setMovementMethod(LinkMovementMethod.getInstance());       // Make the link clickable. Needs to be called after show(), in order to generate hyperlinks
            break;
        case PackageManager.PERMISSION_GRANTED:
            break;
    }
}

有凯泽
2023-03-14

你在哪个版本的Android系统上运行这个?如果是Android6. x,我相信你需要在你的清单中添加ACCESS_FINE_LOCATION权限。例如:

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

我有一个类似的问题,这解决了我。

更新:添加留档直接从谷歌上:

要通过蓝牙和Wi-Fi扫描访问附近外部设备的硬件标识符,您的应用程序现在必须具有访问\u FINE\u LOCATION访问\u rough\u LOCATION权限

更新2020:我们最近更新了我们的应用程序,以SDK版本29为目标。通过这样做,我们的应用程序不再能够再次发现蓝牙设备。从最初编写这个答案开始,我们就一直在使用ACCESS_COARSE_LOCATION。更改为ACCESS_FINE_LOCATION将修复此问题。我现在建议开发人员尝试ACCESS_FINE_LOCATION,如果目标是29。回答更新以反映这一点。

 类似资料:
  • 我正在编写一个Android应用程序,它应该可以通过蓝牙发现设备。 我没有得到任何例外,但设备只是没有找到,即使我的windows pc找到他们(并可以找到自己)。 我肯定他们是好的,但我两种方法都试过了。当然我也分别试过了。 下面是我的ListActivity,它搜索设备: 日志显示扫描后MLEDeviceListAdapter:0和扫描后isEmpty():true。 则从不调用该日志(onS

  • 我正在编写一个应用程序来打开蓝牙,扫描附近可发现的蓝牙设备,包括配对和未配对,以便将它们添加到列表中。 这是我的代码: 代码看起来很好,但它没有找到或添加任何附近的设备到列表中,当我退出应用程序时,我得到以下异常日志: 有解决问题的办法吗? 要将配对设备添加到列表视图,我必须添加一个按钮并将其与scan()方法相关联。这很令人沮丧,当我点击“打开”按钮时,我想填充列表。此外,仍然需要找到未配对的设

  • 我正在开发一个蓝牙4.0低能耗应用程序来快速扫描周围的广告专用设备(每秒10次或更多),并用RSSI获取他们的地址。根据Android蓝牙应用编程接口,发现是异步的,大约需要12秒。有什么办法可以设置这个时间吗?或者可以使用HCI或蓝牙堆栈直接与设备通信?

  • 我想连接第三方蓝牙设备到我的Android Wear手表(三星Gear Live)。我试图找到留档如何做到这一点,但我没有任何运气。所有的搜索,我似乎都认为我想连接到手机上。 有谁知道一个很好的例子来演示如何将蓝牙心率监视器(或其他设备)连接到Android Wear,以便我在手机不存在时保存历史记录?这可能吗?它是否与从手机/平板电脑上执行相同的协议?

  • 我正在创建一个蓝牙扫描仪应用程序,并试图找到可用的设备配对。我有一个蓝牙耳机,我正试图找到运行android 10应用程序。 权限在清单中设置 应用程序包含一个简单的按钮,点击它我开始发现蓝牙设备 用于发现的回调 如果我错过了什么,有人能帮我吗?

  • 我试图创建一个简单的android应用程序来连接到我的ELM327设备,以获取一些汽车诊断数据。但我无法在我的android手机和我的ELM327设备上设置蓝牙连接。 我的代码很简单,如下所示: } 在mainactivity中,我将首先新建一个Bluetooth类,然后调用Bluetooth.connect(): mBluetooth=新蓝牙();MBluetooth.Connect(); 当我