Android 蓝牙 StartDiscovery() 始终返回 false

2023-11-24

我试图发现附近的蓝牙设备,但 startDiscovery() 总是返回 false,就好像它不起作用一样。因此它无法找到设备。

我发现除了蓝牙和蓝牙管理之外,我还必须包含 Coarse_Location 权限,但无论如何,它不起作用。

这是我现在正在尝试的代码,其中主要有痕迹可以看出它是如何工作的:

public class BluetoothActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    ArrayList<BluetoothDevice> dispositivos;
    BTAdapter adaptador;
    BluetoothAdapter mBluetoothAdapter;
    Button buscar;

    final int REQUEST_ACCESS_COARSE_LOCATION = 16;
    @Override
    public void onCreate(Bundle savedInsanceState){
        super.onCreate(savedInsanceState);
        setContentView(R.layout.bluetooth_activity);

        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        if(mBluetoothAdapter != null) {
            Toast.makeText(this, "No es nulo", Toast.LENGTH_SHORT).show();
            if (!mBluetoothAdapter.isEnabled()) {
                Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(intent, RESULT_OK);
            }

            IntentFilter filter = new IntentFilter();

            filter.addAction(BluetoothDevice.ACTION_FOUND);
            filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
            filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

            registerReceiver(mReceiver, filter);

        }

        buscar = findViewById(R.id.buscar);
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(BluetoothActivity.this, "Empezar a buscar", Toast.LENGTH_SHORT).show();

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    switch (ContextCompat.checkSelfPermission(BluetoothActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
                        case PackageManager.PERMISSION_DENIED:
                            ActivityCompat.requestPermissions(BluetoothActivity.this,
                                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                                    REQUEST_ACCESS_COARSE_LOCATION);

                            break;
                        case PackageManager.PERMISSION_GRANTED:
                            boolean a = mBluetoothAdapter.startDiscovery();
                            Toast.makeText(BluetoothActivity.this, "Start discovery es "+a, Toast.LENGTH_SHORT).show();
                            break;
                    }
                }
            }
        });
    }

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(BluetoothDevice.ACTION_FOUND.equals(action)){
                Toast.makeText(BluetoothActivity.this, "Encontrado", Toast.LENGTH_SHORT).show();
            }
        }
    };

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case REQUEST_ACCESS_COARSE_LOCATION: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    boolean a = mBluetoothAdapter.startDiscovery();
                    Toast.makeText(BluetoothActivity.this, "Start discovery es "+a, Toast.LENGTH_SHORT).show();
                }
                else {
                    //exit application or do the needful
                }
                return;
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
    }


}

这里是 android 清单中的权限:


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

    <uses-feature android:name="android.hardware.bluetooth" />

更新:当我单击查看 startDiscovery 方法的描述时,我得到了这个,其中 RequiresPermission 和 startDiscovery 为红色,显示“无法解析方法”,Manifest.permission.BLUETOOTH_ADMIN 下划线并显示“无法找到方法值”:

@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
    public boolean startDiscovery() {
        if (getState() != STATE_ON) {
            return false;
        }
        try {
            mServiceLock.readLock().lock();
            if (mService != null) {
                return mService.startDiscovery(getOpPackageName());
            }
        } catch (RemoteException e) {
            Log.e(TAG, "", e);
        } finally {
            mServiceLock.readLock().unlock();
        }
        return false;
    }

您是否检查过您的设备上的位置已激活?

即使授予了位置权限,当禁用该权限时,蓝牙 API 也无法工作。

所以我建议您添加以下代码以确保权限有效:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!isGpsEnabled) {
  startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), MY_REQUEST_CODE);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 蓝牙 StartDiscovery() 始终返回 false 的相关文章

  • 意图?如何注册以获得传入电子邮件提醒?

    这里是极限 Android 开发新手 好吧 Android 开发新手 而不是一般开发 我想编写一个应用程序 当电子邮件进入设备时会收到通知 并根据电子邮件中的数据 主题 发件人 收件人等 采取各种操作 我认为我要做的是创建一个带有 Inte
  • OPENGL ES 不工作:无当前上下文

    我尝试了 OpenGL ES2 for Android 一书中所示的程序 但它不起作用 我已经在Odroid E 三星s3 三星y 三星star上进行了测试 the gl version suported returns 2 but i g
  • 有没有办法将搜索栏添加到我的实际首选项屏幕?

    我一直看到有关添加您自己的搜索栏首选项的教程 但它不在我实际的 prefs xml 中 有什么方法可以在我的主偏好设置屏幕中添加一个 或者我必须将其分开 Google 似乎有 2 个滑块首选项 搜索栏首选项 https github com
  • 毕加索磁盘缓存

    我正在使用 Picasso 从 URL 加载图像 Picasso with getApplicationContext load product getImageUrl into imageView 据我所知 每次都会访问该网址 而不是缓存
  • 游标索引越界异常

    打开后出现光标索引越界错误 数据库 请任何人告诉我如何打开现有数据库 sqllite Android 我想在数据库上触发一个选择查询 检索一些信息 public void getPatient SQLiteDatabase db Strin
  • Android CursorAdapter、ListView 和后台线程

    我一直在开发的这个应用程序有包含数兆字节数据的数据库可供筛选 许多活动只是列表视图 通过数据库中的各个级别的数据下降 直到到达 文档 即从数据库中提取并显示在手机上的 HTML 我遇到的问题是 其中一些活动需要能够通过捕获击键并重新运行带有
  • FLAG_ACTIVITY_REORDER_TO_FRONT 被忽略

    我有一个包含项目列表的 FragmentActivity 当应用程序处于后台时 可以推送该项目列表 发生这种情况时 我想创建一个状态栏通知并提醒用户更新 当用户单击通知时 活动应重新排序到前面并显示在屏幕上 同时在列表底部显示新项目 所以我
  • 我的 Android 设备需要安装哪个驱动程序才能运行我的应用程序?

    我购买了 intex mobile 来在真实设备中测试我的 Android 应用程序 然而 该设备不存在于 OEM USB 驱动程序列表中 android 提供的设备列表中 我检查了 intex 官方网站 但不确定到底需要安装哪个驱动程序
  • Android BLE 扫描在后台几分钟后停止

    当我为公司开发新冠肺炎接触者追踪应用程序时 我在后台遇到了 Android 扫描停止问题 这是我尝试过的 添加前台服务 禁用手机中所有与电池相关的优化选项 启用后台运行的应用程序 测试设备 搭载 Android 10 的 Galaxy S2
  • 使用 mupdf android 库导航到特定页面

    我如何使用 muPDF 库导航到特定页面 或者有没有办法让图书馆不记得我最后在那个pdf文件中浏览的是哪一页 Uri uri Uri parse path Intent intent new Intent MainActivity getC
  • 如何使用 Swipe 视图实现 Android TabLayout 设计支持库

    我将使用 android TabLayout 设计支持库 但我不知道如何使用滑动视图 这是我的代码 XML
  • 如何更改 Android 12 启动屏幕中的图标形状?

    我想要矩形形状的启动屏幕图标 而不是 android 12 中的圆形形状 我不相信你可以 如果你看这里的第 3 点 https developer android com about versions 12 features splash
  • 在 android 中,第一次单击时按钮侦听器未注册

    因为我是 Android 新手 所以我遇到了按钮监听器的问题 我正在使用 OnClickListener 来处理胸像 但它第一次点击后不执行一旦我单击多个 它就会表现良好 但如何使其在第一次单击时成为可能 这是我的代码 public cla
  • 无法登录 Google Play 游戏服务

    我在开发者控制台上使用包名称和正确的签名证书设置了我的游戏 并为其创建了排行榜 但没有创建任何成就 然后 我从以下位置下载了示例 Type A Number Challenge 和 BaseGameUtils https developer
  • Android复杂布局线性和相对

    I have to implement a layout like shown in the diagram and I do not know the best combination to achieve the required de
  • 使用 RecyclerView.Adapter 在 onBindViewHolder() 内设置 onItemClickListener

    我有一个自定义对象 学生班 public class Student private String name private String age public String getName return name public void
  • 制作弹跳动画

    我想做图层的弹跳动画 我已经完成了该图层从右到中心的操作 现在我想将其向后移动一点 然后回到中心 这会产生反弹效果 我想我可以用这样的翻译来做到这一点
  • 改造方法调用可能会产生“java.lang.NullPointerException”

    使用 Retrofit 2 3 0 我在 Android Studio 中收到以下消息 有关如何删除此 IDE 错误消息的任何建议 谢谢 来自Response文档 http square github io retrofit 2 x ret
  • 如何检查设备上是否安装了文本转语音 (TTS) 的特定语言数据?

    我正在创建一个使用文本转语音的应用程序 我希望用户能够离线使用它 因此我检查设备上是否安装了 TTS 数据 以下是执行此操作的代码 Check tts data is installed Intent checkTTSIntent new
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐

  • 当出现平局时,熊猫如何决定排序顺序?

    熊猫0 12 0 例如 在下面的 DataFrame 中 为什么它会混淆索引 看一下 4 索引从 1 15 6 7 开始 pandas 用于决定如何排序的推理是什么 我怀疑索引会保持顺序以获得相等的值 mydf pd DataFrame n
  • 修复了 g++ 4.9.1 中奇怪的“%a”格式行为?

    编译器 来自 Nuwen 发行版的 64 位 MinGW G 4 9 1 在 Windows 8 1 下 Code ifdef INCLUDE IOSTREAM include
  • 通过 xmlstarlet 中的文本值选择节点

    我正在尝试提取 Value 节点的值 其中 Key 节点是 bash shell 中的 state
  • 拦截(并可能拒绝)Web 套接字升级请求

    我有一个 Node js 服务器 我正在向其发送 Web 套接字升级请求 此请求的授权标头包含登录信息 我需要将其与数据库条目进行比较 我不确定如何阻止 Web 套接字连接打开 直到执行数据库查询回调之后 以下是我目前正在做的事情的简化 v
  • 如何用Qt QPainter绘制线性渐变圆弧?

    我正在尝试开发自定义QProgressBar如下图所示 我创建了一个扩展 QProgressBar 的类并实现了 PaintEvent void CircularProgressBar paintEvent QPaintEvent int
  • 如何从 Java 调用 Excel 电子表格中的 VBA 代码?

    我有一个包含大量 VBA 代码的 Excel 文件 当在 Excel 中打开文档时 用户可以调用 4 个不带参数的公共子例程 这些子例程根据需要操作各个工作表中的数据 我们有一个大型 Java 应用程序 我们希望通过从 Java 环境调用宏
  • 在 Java 中使用长字符串(heredocs) - 可读的方法? [复制]

    这个问题在这里已经有答案了 我需要在 Java 中处理包含换行符的长字符串 这些是用于 HTML 生成的 但这里并不是最重要的 我知道 Java 的缺陷是它所没有的heredocs 但我还可以使用其他机制 1 字符串级联 或 StringB
  • 有人能给我一个node.js应用程序的例子吗

    我试图了解现有的一些较新的 Web 编程框架 即 Node js Rails 和 Sinatra 之间的差异 有人能给我一个最适合每个框架的应用程序示例吗 也就是说 什么是最适合 Node js 而不是 Rails 或 Sinatra 的应
  • Pandas 可以绘制日期直方图吗?

    我已经将我的系列强制转换为 dtype 的日期时间列datetime64 ns 虽然只需要一天的分辨率 不知道如何改变 import pandas as pd df pd read csv somefile csv column df da
  • UIScrollView 缩放后如何重置?

    我有一个正在绘制的图表UIScrollView 是一大块UIView使用自定义子类CATiledLayer作为它的层 当我放大和缩小时UIScrollView 我希望图表能够动态调整大小 就像我从viewForZoomingInScroll
  • 使用 MPMoviePlayerController 禁用 AirPlay

    我有一个实例MPMoviePlayerController它被用来在 iPhone 应用程序上显示一些实时流媒体视频 这工作正常 但我希望删除所有 AirPlay 功能 可以肯定的是 我专门禁用了 AirPlay 如下所示 if self
  • Hibernate 将 NULL 值粘贴到列表中

    我继承了一些使用 Hibernate 的 Java 代码 一些使用此代码的人现在报告说他们到处都遇到 NullPointerExceptions 我已经能够追踪到这一点 发现当我们执行一个从数据库中提取对象列表的查询时 该查询有一个对象列表
  • 如何在 ASP.NET MVC 视图中对 HTML 列表项进行分组?

    我在视图中有这段代码 ul foreach var tag in Model li a href Post Tag tag Id tag Name a li ul 现在我需要按第一个字符对列表项进行分组 例如 A Apple Ant C C
  • 如何使用 Gradle 在 Windows cmd 中执行命令?

    我正在尝试使用 Gradle 执行此命令 build build exe parse p 246 o strings xml bcg novalidate l 1033 sr LbaRoot settings default lss def
  • 计划任务或Windows服务

    我的团队正在争论哪个更好 Windows 服务还是计划任务 我们有一台专门运行作业的服务器 目前它们都是计划任务 有些作业获取文件 重命名它们并将它们放置在网络上的其他目录中 其他作业从 SQL 中提取数据 修改数据并将其传送到其他地方 其
  • Django:MySQL 没有这样的表:aidata.django_session

    我在 Windows 7 上的 Pycharm 中运行 Django 1 4 并且安装了 WAMP 因为我需要将数据存储在 MySQL 表中 这是来自setting py DATABASES default ENGINE django db
  • 将空格转换为换行符

    是否可以使用 CSS 在每个空格上添加换行符 例如 如果我有字符串 Format It 我想像这样显示它 Format It 使用CSS 您可以使用word spacing财产 它定义了单词之间的空间 如果将其设置为容器的大小 它将强制换行
  • React Native - 当数据未更改时强制 ListView 重新渲染

    即使数据源中的数据没有更改 是否可以强制 ListView 重新渲染 我的应用程序的选项卡栏中有一个 ListView 我希望每次选择该选项卡时它都会重绘 无论数据是否相同或已更改 this state data props data da
  • 传递数据到node + express中查看

    我正在使用我的节点应用程序从 API 检索一些数据 并希望在视图中显示该数据并允许用户在那里更改它 我正在调用 api 并获得一个 JSON 响应 我想将其传递到视图上 这就是我正在做的 var query SELECT Id OwnerI
  • Android 蓝牙 StartDiscovery() 始终返回 false

    我试图发现附近的蓝牙设备 但 startDiscovery 总是返回 false 就好像它不起作用一样 因此它无法找到设备 我发现除了蓝牙和蓝牙管理之外 我还必须包含 Coarse Location 权限 但无论如何 它不起作用 这是我现在