Android 4.0+ 与嵌入式设备的蓝牙连接错误:“权限被拒绝”

2023-12-05

我有以下设置:

Android 设备使用“客户端”套接字连接到远程嵌入式设备,Android 应用程序使用以下代码片段连接到嵌入式设备。

在嵌入式设备上使用MindTree BT堆栈,其中服务器串行套接字是根据设备中的一些属性准备的,这是Android应用程序熟悉的,在嵌入式设备上定义的连接是不安全的!

两个应用程序的组合适用于:

  • 2部LG手机不同型号(版本代码 使用“普通方法”)
  • 2 HTC's不同型号(版本代码 使用“解决方法”)
  • Pantech 平板电脑(版本代码 使用“解决方法”)

今天,我在三星 S3、摩托罗拉 MB886 和 Nexus 7 上尝试了该应用程序... 致电时,所有结果都是“权限被拒绝”套接字.connect()...(我在清单中拥有适当的权限,否则它无法在其他设备上工作。)

我测试过的所有新设备的版本代码都> 4.0,所以我想知道:

有谁知道API有什么变化吗? 也许 Android 4.0+ 强制安全?

看来错误发生在 Bonding 状态下,因为我可以在嵌入式程序日志上看到......

有什么见解吗?

代码:

public final synchronized int connectToDevice(int connectingMethod)
        throws BluetoohConnectionException {
    if (socket != null)
        throw new BadImplementationException("Error socket is not null!!");
    connecting = true;
    logInfo("+---+ Connecting to device...");

    try {
        lastException = null;
        lastPacket = null;
        if (connectingMethod == BluetoothModule.BT_StandardConnection
                || connectingMethod == BluetoothModule.BT_ConnectionTBD)
            try {

                socket = fetchBT_Socket_Normal();
                connectToSocket(socket);
                listenForIncomingSPP_Packets();
                onConnetionEstablished();
                return BluetoothModule.BT_StandardConnection;
            } catch (BluetoohConnectionException e) {
                socket = null;
                if (connectingMethod == BluetoothModule.BT_StandardConnection) {
                    throw e;
                }
                logWarning("Error creating socket!", e);
            }
        if (connectingMethod == BluetoothModule.BT_ReflectiveConnection
                || connectingMethod == BluetoothModule.BT_ConnectionTBD)
            try {
                socket = fetchBT_Socket_Reflection(1);
                connectToSocket(socket);
                listenForIncomingSPP_Packets();
                onConnetionEstablished();
                return BluetoothModule.BT_ReflectiveConnection;
            } catch (BluetoohConnectionException e) {
                socket = null;
                if (connectingMethod == BluetoothModule.BT_ReflectiveConnection) {
                    throw e;
                }
                logWarning("Error creating socket!", e);
            }
        throw new BluetoohConnectionException("Error creating RFcomm socket for BT Device:" + this
                + "\n BAD connectingMethod==" + connectingMethod);
    } finally {
        connecting = false;
    }
}

protected void onConnetionEstablished() {
    logInfo("+---+ Connection established");
}

private synchronized void listenForIncomingSPP_Packets() {
    if (socketListeningThread != null)
        throw new BadImplementationException("Already lisening on Socket for BT Device" + this);
    logInfo("+---+ Listening for incoming packets");
    socketListeningThread = new Thread(socketListener, "Packet Listener - " + bluetoothDevice.getName());
    socketListeningThread.start();
}

private BluetoothSocket fetchBT_Socket_Normal()
        throws BluetoohConnectionException {
    try {
        logInfo("+---+ Fetching BT RFcomm Socket standard for UUID: " + uuid + "...");
        return bluetoothDevice.createRfcommSocketToServiceRecord(UUID.fromString(uuid));
    } catch (Exception e) {
        throw new BluetoohConnectionException("Error Fetching BT RFcomm Socket!", e);
    }
}

private BluetoothSocket fetchBT_Socket_Reflection(int connectionIndex)
        throws BluetoohConnectionException {
    Method m;
    try {
        logInfo("+---+ Fetching BT RFcomm Socket workaround index " + connectionIndex + "...");
        m = bluetoothDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class});
        return (BluetoothSocket) m.invoke(bluetoothDevice, connectionIndex);
    } catch (Exception e) {
        throw new BluetoohConnectionException("Error Fetching BT RFcomm Socket!", e);
    }
}

private void connectToSocket(BluetoothSocket socket)
        throws BluetoohConnectionException {
    try {
        logInfo("+---+ Connecting to socket...");
        socket.connect();
        logInfo("+---+ Connected to socket");
    } catch (IOException e) {
        try {
            socket.close();
        } catch (IOException e1) {
            logError("Error while closing socket", e1);
        } finally {
            socket = null;
        }
        throw new BluetoohConnectionException("Error connecting to socket with Device" + this, e);
    }
}

经过很长一段时间的调查后,我发现了错误的一个原因......在某些 Android 设备上,自动蓝牙对等互连未启用/允许。

所以,显然除了两种连接方法外,还有两种蓝牙适配器启用方法,一种是抛出一个意图要求系统打开适配器,另一种是调用BluetoothAdapter.enable()方法,这会默默地启用蓝牙。

第一种方法,弹出确认对话框,需要用户交互,而另一种则不需要,虽然不显示蓝牙启用确认对话框,但也不显示对等确认,这会导致连接错误。

使用第一种适配器启用方法可以解决大多数设备上的问题,例如 Nexus 7、三星 S3 和其他一些设备,但在某些设备上仍然存在问题,我不太确定为什么,但这是好多了,因为许多设备现在都可以使用新的实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 4.0+ 与嵌入式设备的蓝牙连接错误:“权限被拒绝” 的相关文章

  • android中向sqlite中插入大量数据

    目前 我必须一次向我的 Android 中插入超过 100 亿条数据 然而 内存不足的问题会使程序崩溃 sqlite 插入测试非常简单 只需使用 for 循环生成 sql 插入命令并通过 开始 和 提交 进行包装 private Array
  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • 如何在android中获取Camera2 API的当前曝光

    In android hardware Camera旧的 我使用下面的代码获取当前曝光并获取它Camera Camera Parameters param mCamera getParameters currentExposure para
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 是否必须删除 Intent extra?

    这可能是一个愚蠢的问题 但是是否有一条规则规定消费活动必须显式删除 Intent 额外内容 或者只有在回收 Intent 对象时才如此 换句话说 如果我总是通过执行以下操作来链接到下一个活动 Intent i new Intent MyCu
  • 带有 EditText 和 Spinner 的对话框

    我有一个按钮 单击后会弹出一个对话框 我希望对话框有一个EditText and a Spinner对话框内 我不知道如何设置它的视图 我有一个代码AlertDialog它有效 只是EditText and Spinner我需要将其放入其中
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • 我想实现下面的布局,按钮应该在屏幕底部,当惰性列被填充时,按钮不应该出去

    顶部有惰性列 惰性列下方有输入电话号码布局并从电话簿布局添加联系人 我希望当未添加联系人时此布局位于顶部 当我添加大量联系人时输入电话号码并添加电话簿布局中的联系人会随着惰性列滚动并移出屏幕 我不让他们走出屏幕 当接触较多时 它们必须粘在底
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • Android 套接字和 asynctask

    我即将开始制作一个应该充当 tcp 聊天客户端的应用程序 我一直在阅读和阅读 我得出的结论是最好 如果不需要 将我的套接字和异步任务中的阅读器 问题是我不确定从哪里开始 因为我是 Android 新手 这至少对我来说是一项艰巨的任务 但据我
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 带有每个选项卡绑定的 WPF 路由命令

    我打算禁用和启用 TabControl 外部的按钮 就像当前选项卡更改时 TabItem 内部的按钮一样 但 TabItem 的 CommandBindings 似乎不会影响可视化树的 向上 什么is正确的方法是这样做吗 使用此 XAML
  • 我如何处理这个字符串来打开我的应用程序

    我在浏览器重定向中得到这个字符串 意图 view id 123 Intent package com myapp scheme myapp launchFlags 268435456 end 我该如何使用它 在发现 http fokkezb
  • 数据库名称作为存储过程 SQL Server 中的参数

    我希望将数据库名称作为参数传递给存储过程 并且希望在 where 条件中使用它来设置存储过程的数据库 但我收到一个错误 附近的语法不正确 示例代码 Create proc dbo stored procedure one variable1
  • 圆碰撞后的新速度

    在圆形台球桌上 台球以速度 v1 与台球边界碰撞 该碰撞检测如下 double s sqrt p x a p x a p y b p y b if s
  • SQLAlchemy:FROM 条目仍然存在于相关子查询中

    我正在尝试构建以下查询 用作包含查询的子查询 该查询定义了名为tbl outer 与 SQLAlchemy SELECT max tbl ts AS max 1 FROM tbl WHERE tbl id tbl outer id 当我阅读
  • OpenMP 和 Python

    我有为共享内存机器 C 和 FORTRAN 编写 OpenMP 的经验 以执行简单的任务 如矩阵加法 乘法等 只是为了看看它如何与 LAPACK 竞争 我对 OpenMP 的了解足以执行简单的任务 而无需查看文档 最近 我的项目转向了 Py
  • 使用 Ninject(或其他一些容器) 如何找出请求服务的类型?

    假设我有一个服务接口 public interface IFooService void DoSomething 该服务的具体实现是通用的 public class FooService
  • print_r() 将属性添加到 DateTime 对象[重复]

    这个问题在这里已经有答案了 考虑以下代码示例 m oDate new DateTime 2013 06 12 15 54 25 print r m oDate echo m oDate gt date 从 PHP 5 3 开始 这会产生 类
  • 如何重定向 stdout 和 stderr 流(多平台)?

    我正在编写使用外部库的 GL 应用程序 它将错误打印到控制台 我想捕获它并在游戏控制台中打印 PS 抱歉 我的英语不好 您可以采取两种基本方法来实现此目的 如果库都使用std cout对于你想要捕获的 IO 你可以写你自己的basic st
  • 尝试混合 CSV 和哈希表中的数据来创建变量

    我停在代码审查 询问我如何简化脚本 并建议使用哈希表因为它会清理代码 我得到了一个非常基本的例子 但事实并非如此即插即用 我已经编写了一些基本代码 但它没有做我认为应该做的事情 我知道代码审查人员不会提供这样的支持 所以我在这里寻求有关组合
  • 如何在运行时检查子类是否是类的实例? [复制]

    这个问题在这里已经有答案了 在 Android 应用程序测试套件中 我有一个这样的类 其中B是一个视图 public class A extends B etc 现在我有一个视图对象列表 其中可能包含A对象 但在这种情况下我只关心它们是否是
  • 如何一次选择多个联系人?

    我使用以下代码将电话簿联系人检索到我的应用程序 public void onCreate Bundle savedInstanceState super onCreate savedInstanceState setContentView
  • 在 Twitter Bootstrap 模式中动态加载谷歌地图

    我正在尝试在 Twitter 引导程序的模式窗口内动态添加地图 但它似乎不起作用
  • 在 Apache Camel 中动态加载路由的最佳方法

    我们开发了基于 Karaf 和 A pache Camel 的应用程序 虽然我们的应用程序完全基于包 OSGI 但我们还在启动时加载Camel上下文 及其 路由上下文 这意味着我们已经定义了一些静态路由 我的问题是 有没有一种方法可以在应用
  • 为什么 Json.NET 序列化会因 [Serialized] 和只读属性内的 lambda 而失败?

    根据这些发行说明 Json NET 现在支持 SerializedAttribute Json NET 现在可以检测具有 SerializedAttribute 的类型 并序列化该类型上的所有字段 公共字段和私有字段 并忽略这些属性 我有以
  • 如何使用 Selenium 设置隐藏输入的值?

    我已经看过了this但没有运气 我试过那个例子 它说undefined browserbot 我也尝试过简单的 browser navigate to http example com browser execute script hidd
  • Git 拉取时忽略文件

    我是 github 的新手 我正在开发一个应用程序 它有config php您必须输入数据库凭据的文件 在我的 github 存储库中 文件如下所示 但在网站上我有带有凭据的文件 In th
  • 如何在主项目中包含多个 Xcode 项目

    我最近问过使用多个 Xcode 项目的智慧分离项目组件 我决定在我的下一个项目中遵循这条路线 我尝试通过将另一个项目拖放到侧边栏来将其添加到主 Xcode 项目中 但是 当我 import 添加的项目中定义的任何类时 我被告知找不到这些类
  • JAVA 6x6 网格填色游戏

    大家好 我现在进入最后一部分 即文件读取 我尝试编写一个 fileReader 但似乎没有更改变量 rNum 的值 关于为什么以下陈述不会改变的任何想法 谢谢 public void readStartFile String fileNam
  • Android 4.0+ 与嵌入式设备的蓝牙连接错误:“权限被拒绝”

    我有以下设置 Android 设备使用 客户端 套接字连接到远程嵌入式设备 Android 应用程序使用以下代码片段连接到嵌入式设备 在嵌入式设备上使用MindTree BT堆栈 其中服务器串行套接字是根据设备中的一些属性准备的 这是And