Android BLE广告停止失败问题解析与解决方案

android ble广告停止失败问题解析与解决方案

本文旨在解决Android平台上蓝牙低功耗(BLE)广告无法正常停止的问题。核心在于启动和停止BLE广告时,必须使用同一个AdvertiseCallback实例。文章将详细阐述这一关键原理,并通过代码示例展示正确的广告启动与停止流程,强调AdvertiseCallback作为广告会话唯一标识的重要性,帮助开发者确保BLE广告功能的稳定可靠。

1. Android BLE广告启动概述

在Android平台上,应用程序可以通过蓝牙低功耗(BLE)功能广播数据,这通常用于设备发现或数据传输。启动BLE广告需要通过BluetoothLeAdvertiser类,并配置AdvertiseSettings和AdvertiseData。其中,AdvertiseCallback是一个至关重要的组件,用于接收广告启动成功或失败的回调。

以下是启动BLE广告的基本代码示例:

public class BleAdvertiserManager {    private static final String TAG = "BleAdvertiserManager";    private BluetoothLeAdvertiser advertiser;    private AdvertiseCallback advertiseCallback; // 用于存储AdvertiseCallback实例    // 假设 serviceId 和 packet 已经定义    private ParcelUuid serviceId = ParcelUuid.fromString("0000180A-0000-1000-8000-00805F9B34FB"); // 示例服务UUID    private byte[] packet = new byte[]{0x01, 0x02, 0x03, 0x04}; // 示例服务数据    public BleAdvertiserManager() {        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();        if (bluetoothAdapter != null) {            advertiser = bluetoothAdapter.getBluetoothLeAdvertiser();        }    }    public void startAdvertising() {        if (advertiser == null) {            Log.e(TAG, "BluetoothLeAdvertiser not available.");            return;        }        AdvertiseSettings advSettings = new AdvertiseSettings.Builder()                .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)                .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)                .setConnectable(false) // 设置为不可连接的广告                .setTimeout(0) // 广告不超时,持续广播                .build();        AdvertiseData data = new AdvertiseData.Builder()                .setIncludeDeviceName(true)                .setIncludeTxPowerLevel(false)                .addServiceUuid(serviceId)                .build();        AdvertiseData response = new AdvertiseData.Builder()                .setIncludeDeviceName(false)                .setIncludeTxPowerLevel(false)                .addServiceData(serviceId, packet)                .build();        // 创建并存储AdvertiseCallback实例        advertiseCallback = new AdvertiseCallback() {            @Override            public void onStartSuccess(AdvertiseSettings settingsInEffect) {                super.onStartSuccess(settingsInEffect);                Log.d(TAG, "BLE advertising started successfully.");            }            @Override            public void onStartFailure(int errorCode) {                super.onStartFailure(errorCode);                Log.e(TAG, "BLE advertising failed to start: " + errorCode);            }        };        advertiser.startAdvertising(advSettings, data, response, advertiseCallback);    }}

在上述代码中,startAdvertising方法创建了一个AdvertiseCallback匿名内部类实例,并将其传递给advertiser.startAdvertising()。这个advertiseCallback实例被存储在类成员变量中,以便后续使用。

2. 广告停止的常见误区与问题分析

许多开发者在尝试停止BLE广告时,可能会遇到广告无法停止的问题,即使调用了stopAdvertising方法。这通常是由于在停止广告时,传递了与启动广告时不同的AdvertiseCallback实例。

考虑以下错误的停止广告实现方式:

// 错误的停止广告方法示例public void stopAdvertisingIncorrect() {    if (advertiser == null) {        Log.d(TAG, "Advertiser is null, nothing to stop.");        return;    }    Log.d(TAG, "Attempting to stop advertising incorrectly...");    // 错误:这里创建了一个新的 AdvertiseCallback 实例    advertiser.stopAdvertising(new AdvertiseCallback() {        @Override        public void onStartSuccess(AdvertiseSettings settingsInEffect) {            // 注意:停止成功的回调实际上是 onStopSuccess,这里是示例错误            Log.d(TAG, "onStopSuccess (incorrect callback)");            super.onStartSuccess(settingsInEffect);        }        @Override        public void onStartFailure(int errorCode) {            // 注意:停止失败的回调实际上是 onStopFailure,这里是示例错误            Log.e(TAG, "onStopFailure (incorrect callback): " + errorCode);            super.onStartFailure(errorCode);        }    });    // 即使将 advertiser 置为 null,也不会停止实际的广播    // advertiser = null; }

当使用上述stopAdvertisingIncorrect方法时,日志中可能会出现类似D/BluetoothLeAdvertiser: wrapper is null的提示,并且广告实际上并未停止。这是因为BluetoothLeAdvertiser内部使用AdvertiseCallback对象作为标识符来管理不同的广告会话。如果你传递了一个新的、不同的AdvertiseCallback对象给stopAdvertising,系统将无法识别到你想要停止的是哪一个正在运行的广告会话,从而导致停止操作失败。

3. 正确停止BLE广告的实现

根据Google官方文档的说明,stopAdvertising方法中的callback参数必须是与startAdvertising方法中使用的同一个实例。这是因为AdvertiseCallback对象在内部被用作一个唯一的键,以识别和管理特定的广告会话。

因此,正确的做法是保存启动广告时使用的AdvertiseCallback实例,并在停止广告时重复使用它。

// 正确的停止广告方法示例public void stopAdvertising() {    if (advertiser == null || advertiseCallback == null) {        Log.d(TAG, "Advertiser or callback is null, nothing to stop.");        return;    }    Log.d(TAG, "Attempting to stop advertising correctly...");    // 正确:使用之前启动广告时存储的同一个 advertiseCallback 实例    advertiser.stopAdvertising(advertiseCallback);    // 停止后可以将 advertiseCallback 置为 null,防止重复停止或资源泄露    advertiseCallback = null;    // advertiser = null; // 根据需要决定是否清空advertiser引用}

通过这种方式,当调用stopAdvertising(advertiseCallback)时,系统能够通过传入的advertiseCallback实例准确地找到对应的正在运行的广告会话并将其停止。

4. 原理深入解析

BluetoothLeAdvertiser的stopAdvertising方法要求传入的AdvertiseCallback对象与启动广告时使用的对象完全一致。这背后的原理是,Android系统在内部维护了一个映射表,将每个活动的BLE广告会话与一个特定的AdvertiseCallback实例关联起来。当调用stopAdvertising时,系统会查找与传入的AdvertiseCallback对象匹配的活动会话,然后将其终止。

Google官方文档对此有明确说明:* Stop Bluetooth LE advertising. The {@code callback} must be the same one use in * {@link BluetoothLeAdvertiser#startAdvertising}.(停止蓝牙低功耗广告。callback必须是与BluetoothLeAdvertiser#startAdvertising中使用的同一个。)

这意味着AdvertiseCallback不仅是一个回调接口,它更是一个会话的唯一标识符。如果传入的AdvertiseCallback对象不匹配,系统就无法知道要停止哪个广告,因此广告会持续运行。

5. 注意事项

AdvertiseCallback实例管理: 务必在启动广告时将AdvertiseCallback实例存储为一个类的成员变量或以其他方式使其可被stopAdvertising方法访问。生命周期管理: 在Android应用中,应将BLE广告的启动和停止与组件(如Activity或Service)的生命周期同步。例如,在onStart()或onCreate()中启动广告,在onStop()或onDestroy()中停止广告,以避免资源泄露和不必要的电池消耗。权限检查: 在进行BLE操作前,确保应用已获得BLUETOOTH、BLUETOOTH_ADMIN和ACCESS_FINE_LOCATION(或ACCESS_COARSE_LOCATION)等必要的运行时权限。蓝牙状态检查: 在启动或停止广告前,检查设备的蓝牙是否已开启,以及是否支持BLE广告功能(BluetoothAdapter.isMultipleAdvertisementSupported())。错误处理: AdvertiseCallback中的onStartFailure和onStopFailure提供了错误码,开发者应根据这些错误码进行适当的错误处理和用户提示。

6. 总结

Android BLE广告无法停止的问题,其根本原因在于startAdvertising和stopAdvertising方法中AdvertiseCallback实例的不一致。通过确保在停止广告时使用与启动广告时完全相同的AdvertiseCallback对象,开发者可以有效解决此问题,并确保BLE广告功能的正常启动与停止。理解AdvertiseCallback作为广告会话唯一标识符的关键作用,是正确实现Android BLE广告管理的核心。

以上就是Android BLE广告停止失败问题解析与解决方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/109023.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月23日 00:32:31
下一篇 2025年11月23日 00:52:54

相关推荐

  • 稳定币十大交易平台app下载

    稳定币交易平台在全球范围内扮演着重要角色,为用户提供高效、低风险的交易环境。随着市场需求的增长,越来越多的平台开始支持稳定币交易,但选择一家安全、流动性高的平台至关重要。以下是当前市场上十大稳定币交易平台的排名及特点介绍。 1. Binance 全球最大的加密货币交易平台之一,支持多种稳定币交易对,…

    2025年12月8日 好文分享
    000
  • 7月底加密货币新币全网出现频率最高的top3是哪些

    2025年7月底最受关注的三大加密货币新币为:1. BlockDAG(BDAG),采用DAG架构支持15,000+ TPS,预售募资3.48亿美元,当前价$0.0016,预期上线价$0.05,潜在回报率3,025%;2. Arctic Pab lo Coin(APC),实行通缩模型与66% APY高…

    2025年12月8日
    000
  • 加密货币追踪市场热点行情的软件有哪些?

    在数字资产领域,主流行情工具分为三类:一是综合数据平台,如CoinGecko覆盖10,000+加密货币与3,000+NFT系列,支持100+类别筛选;CoinCarp追踪20,000+资产并监控链上余额;CoinAnk专注衍生品,提供爆仓热图与百种技术模型。二是AI驱动型工具,如3EX Crypto…

    2025年12月8日
    000
  • 币安是什么 币安怎么下载

    币安下载需通过官方渠道完成,1. 网页版访问国际站或地区合规子站;2. 手机APP下载:iOS用户通过官网链接、安卓用户可下载APK或使用Google Play;3. 注册并完成KYC认证及二次验证以确保账户安全,务必注意防范钓鱼网站和遵守当地法规,使用官方途径保障交易安全。 币安(Binance)…

    2025年12月8日
    000
  • 新手进行加密货币投资必须了解的5个市场趋势(保姆级教学内附APP)

    对于新手来说,理论学习与实践探索需要同步进行。以下提到的趋势和相关项目,通常可以在行业领先的综合性平台中找到。例如,欧意OKX 、Binance必安、火必HTX和Gate.io大门等平台,不仅提供了丰富的资产选择,还设有学院或学习板块,是获取前沿资讯、了解项目信息和进行安全交易的理想起点。建议您可以…

    2025年12月8日
    000
  • 手机上能看币圈行情的网站有哪些?中文界面行情网站推荐

    随着手机成为主要的上网设备,能够在手机上便捷查看币圈行情的网站变得尤为重要。特别是支持中文界面的网站,更符合国内用户的使用习惯。下面推荐几款适合手机访问且界面友好的中文行情网站,帮助你随时随地掌握虚拟币市场动态。 在介绍行情网站前,推荐优先注册使用币安交易平台,不仅支持手机端行情实时查看,还能随时进…

    2025年12月8日
    000
  • 支持中文界面的行情网站有哪些?适合中文用户的币种行情网站推荐

    对于中文用户来说,选择一款支持中文界面的币种行情网站,可以更方便地获取虚拟币的实时价格、涨跌幅以及市场动态。以下推荐几款界面友好、功能丰富且支持中文显示的行情平台,帮助用户更高效地追踪市场变化。 推荐几大支持中文的币种行情网站 CoinMarketCap(coinmarketcap.com) 提供多…

    2025年12月8日
    000
  • POLKADOT币是什么?如何通过DOT生态赚取奖励?

    Polkadot(DOT)是一个由中继链和多条平行链组成的多链网络,旨在实现区块链间的互操作性和共享安全。1、通过Binance、OKX、火必、Gate.io等交易平台的锁仓理财产品获取固定收益;2、作为提名人质押DOT委托验证人,参与NPoS共识以获得质押奖励;3、参与平行链插槽拍卖(Crowdl…

    2025年12月8日
    000
  • 比特币和以太坊行情怎么查看?比特币和以太坊实时价格工具网站推荐

    比特币与以太坊作为币圈最具代表性的两大主流资产,其行情变化牵动着整个市场走势。了解如何查看比特币和以太坊的实时价格,对于新手入门尤为重要。以下推荐几款适合查看这两种币种的行情工具与平台。 主流行情网站推荐:支持BTC与ETH实时追踪 CoinMarketCap 提供比特币和以太坊的实时价格、涨跌幅、…

    2025年12月8日
    000
  • Spark(SPK)代币是什么?前景如何?SPK币空投,价格及未来展望

    spark (spk) 代币是 spark 协议的原生治理和质押代币。该协议致力于成为链上金融的流动性和收益基础设施层,旨在解决 defi(去中心化金融)领域中流动性分散、收益不稳定以及稳定币资本闲置等核心问题。spark 协议已部署在以太坊、arbitrum、base、optimism 等多个区块…

    2025年12月8日
    000
  • 哪些网站可以看到虚拟币K线图?币圈行情图表网站精选

    在观察虚拟币走势时,k线图是分析涨跌趋势与交易信号的重要工具。许多行情平台都支持查看k线图,但功能、界面和适配程度略有不同。以下为用户精选几款适合新手使用的虚拟币行情图表平台,帮助你轻松掌握图表分析。 支持K线图的主流行情平台推荐 CoinMarketCap 提供基础K线图功能,适合查看币种的价格波…

    2025年12月8日
    000
  • 2025年最值得关注的5大潜力币种,分析师预测年内翻倍

    随着加密市场进入新的周期,寻找具有巨大增长潜力的项目成为投资者的首要任务。本文将为您盘点并深入分析2025年最值得关注的五大潜力币种,这些项目凭借其强大的技术基础、活跃的生态系统和清晰的市场定位,被许多分析师预测年内有望实现价值翻倍。 2025其他主流比特币交易所: 欧易okx:   币安binan…

    2025年12月8日
    000
  • PIXEL币是什么?如何参与PIXEL生态获取奖励?

    PIXEL是Web3游戏《Pixels》的原生功能型与治理型代币,用户可通过Binance必安、欧意ok、火必HTX、Gate.io大门等主流平台获取;1、该代币作为游戏经济核心,用于购买道具、升级土地和解锁内容;2、赋予持有者社区治理投票权,参与游戏发展决策;3、依托Ronin网络的强大生态背景,…

    2025年12月8日
    000
  • MEME币板块的主流币有哪些 市值高的MEME币介绍

    截至2025年7月,MEME币总市值突破900亿美元,Solana与BNB Chain生态成为主流。1. Pudgy Penguins(PENGU)市值达27.85亿美元,凭借实体零售、交易所采用及游戏封测推动价格30日内涨400%;2. Bonk(BONK)市值27.01亿美元,跨链扩展至BNB …

    2025年12月8日
    000
  • 2025年市值最高的稳定币 个人怎么购买稳定币

    2025年市值领先的稳定币预计为:1. Tether (USDT),凭借其广泛的市场接受度和高流动性占据首位;2. USD Coin (USDC),以合规性和透明审计赢得信任。 本文旨在预测2025年市值领先的稳定币,并为个人投资者提供一份清晰的购买指南。通过了解这些主流稳定币的特点以及如何在币安、…

    2025年12月8日
    000
  • 链上数据分析工具是什么?好用的链上数据分析工具有哪些?

    链上数据分析工具是解析、可视化和解释区块链公开交易数据的平台,能将原始信息转化为可理解的指标与图表,帮助用户洞察市场动态、追踪资金流向并识别异常行为;主流工具包括:1. Dune Analytics,支持SQL查询与交互式仪表板,覆盖多条主流链,适合DeFi与NFT分析;2. Blockchair,…

    2025年12月8日
    000
  • 怎么查看加密货币在区块链上的交易流动情况?

    查看加密货币在区块链上的交易流动需使用区块链浏览器、链上数据分析工具和实时监控工具。1. 区块链浏览器如Etherscan、Blockchain.com和HypurrScan用于查询地址余额、交易记录和代币流动,可追踪巨鲸大额转账行为;2. 链上分析工具如Nansen和GMGN通过地址标签识别聪明钱…

    2025年12月8日
    000
  • 曾经是百倍币的市值较高的币有哪些?

    加密货币领域中,BNB以7年700倍涨幅成为生态驱动典范,1. BNB从0.1美元涨至804美元,市值达1115亿美元,核心在于币安“币股微策略”与去证券化生态;2. Solana从0.5美元升至295美元,技术支撑65,000 TPS并获PayPal等机构采用;3. Trump币12小时暴涨166…

    2025年12月8日
    000
  • 以太坊稳定币供应量破1400亿美元

    根据最新行业数据,发行在以太坊网络上的稳定币总供应量已正式突破1400亿美元大关。这一里程碑不仅彰显了以太坊作为稳定币核心发行平台的地位,也反映了去中心化金融(defi)生态对数字美元的强劲需求。本文将解析这一重要数据,并为您介绍交易这些主流稳定币的顶级平台。 2025年主流的交易所: 欧易okx:…

    2025年12月8日
    000
  • 为什么今天(7月24日)加密货币大跌,是回调还是真正的下跌信号?

    本次大跌主要由技术阻力、杠杆清算与资金流动变化引发,短期回调概率高于趋势逆转。1)比特币跌至118,692美元,未能突破12万美元阻力,以太坊跌超3%,山寨币普遍大跌;2)全网爆仓超11亿美元,衍生品高杠杆加剧波动;3)技术面超买引发获利回吐,资金从山寨币回流比特币,现货ETF转为净流出;4)当前技…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信