首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对安卓系统中直接广告(ADV_DIRECT_IND)的反应

问对安卓系统中直接广告(ADV_DIRECT_IND)的反应
EN

Stack Overflow用户
提问于 2015-08-07 14:34:11
回答 2查看 3.8K关注 0票数 7

如何对安卓系统中的直接广告 (ADV_DIRECT_IND == 0001)做出反应?

有一个BLE小工具,它向安卓手机发送定向广告(目前使用的是硬编码的手机MAC地址),在我的安卓应用程序中,我想做出反应,启动与该小工具的连接,并从该小工具读取速度值:

​

​

如果可能的话,请告知Android 5 API。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-13 17:43:23

直接广告确实有效--至少对HTC M8手机和Android5.0(APILevel21及更高版本)是有效的。

解决方案是将设备地址添加到ScanFilter中。

如果将筛选器保持为空,则不会调用扫描回调。

这里我的工作代码:

代码语言:javascript
复制
public static final String TAG = "My_BLE_app";

public static final String DEVICE_1 = "D4:BE:84:72:5B:8E";
public static final String DEVICE_2 = "C4:39:07:19:60:E2";

private Context mContext;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothLeScanner mScanner;
private ScanSettings mSettings;
private List<ScanFilter> mFilters = new ArrayList<ScanFilter>();

首先,初始化BLE的方法:

代码语言:javascript
复制
public boolean init() {
    BluetoothManager bluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
    mBluetoothAdapter = bluetoothManager.getAdapter();
    if (mBluetoothAdapter == null)
        return false;

    mScanner = mBluetoothAdapter.getBluetoothLeScanner();
    mSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();

    mFilters.add(new ScanFilter.Builder().setDeviceAddress(DEVICE_1).build());
    mFilters.add(new ScanFilter.Builder().setDeviceAddress(DEVICE_2).build());

    return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE);
}

然后是扫描回调:

代码语言:javascript
复制
private ScanCallback mDirectedScanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        processResult(result);
    }

    @Override
    public void onBatchScanResults(List<ScanResult> results) {
        for (ScanResult result: results) {
            processResult(result);
        }
    }

    private void processResult(ScanResult result) {
        BluetoothDevice device = result.getDevice();
        if (device == null)
            return;

        String address = device.getAddress();
        if (!BluetoothAdapter.checkBluetoothAddress(address))
            return;

        int rssi = result.getRssi();

        Log.d(TAG, "address=" + address + ", rssi=" + rssi);

        // TODO connect to the device in under 1 second
    }
};

最后,启动扫描的代码:

代码语言:javascript
复制
mScanner.startScan(mFilters, mSettings, mDirectedScanCallback);

但仍有一个问题有待解决:

我不知道如何检测安卓端的扫描类型--也就是说,扫描是定向的还是非的。

票数 4
EN

Stack Overflow用户

发布于 2017-01-16 20:39:26

为了部分回答公开的问题:

我已经注意到,对于定向扫描(ADV_DIRECT_IND),ScanRecord.getBytes()是空的--所有的'\0‘--但是会包含否则的广告数据(ADV_IND)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31880312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档