Android BTLE - >找不到回调包装

时间:2016-05-13 00:25:10

标签: android altbeacon android-ibeacon

我在我的应用程序中使用Android Beacon Library,我逐字逐句地复制了他们的测距示例,但我一直收到你在代码下面看到的错误。任何帮助将不胜感激,我刚刚进入BTLE / beacons

package com.example.josh.beacons;

import android.os.Bundle;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.RangeNotifier;
import org.altbeacon.beacon.Region;

import java.util.Collection;

public class MainActivity extends AppCompatActivity implements BeaconConsumer {
    protected static final String TAG = "RangingActivity";
    private BeaconManager beaconManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        beaconManager = BeaconManager.getInstanceForApplication(this);
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
        beaconManager.bind(this);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        beaconManager.unbind(this);
    }
    @Override
    public void onBeaconServiceConnect() {
        beaconManager.setRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                if (beacons.size() > 0) {
                    Log.i(TAG, "The first beacon I see is about " + beacons.iterator().next().getDistance() + " meters away.");
                }
            }
        });

        try {
            beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        } catch (RemoteException e) {    }
    }
}

我得到的错误:

05-12 20:21:44.769 25775-25775/com.example.josh.beacons D/BluetoothAdapter: STATE_ON
05-12 20:21:44.770 25775-25775/com.example.josh.beacons D/BluetoothLeScanner: could not find callback wrapper
05-12 20:21:44.787 25775-26783/com.example.josh.beacons D/RangingActivity: didRangeBeacons 0

4 个答案:

答案 0 :(得分:9)

虽然你可以,正如例外答案所说的那样,安全地忽略了这个消息,它告诉你一些事情。很可能它告诉您,您的设备已关闭您的应用的位置权限,这会阻止您的信标扫描工作。如果该应用具有适当的权限并且正确扫描,您将看到更像

的内容
D/BluetoothAdapter: STATE_ON
D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5

如果您的目标是API级别23+,即使您的minsdk设置得较低(如16),您也一定要检查代码中是否启用了位置权限。

我失去了很多时间才意识到由于应用程序关闭了位置服务而导致无声失败。

答案 1 :(得分:7)

如果不是来自您自己的代码,请注意不要过于严肃地对待您在LogCat中看到的行。如果行以&#34; D /&#34;开头,这表示调试行,而不是错误(&#34; E /&#34;)我已经构建了数十个信标应用,看到这条线的次数比我可以计算的多,并且可以自信地说它并不表示存在问题。

底线:您可以放心地忽略该消息。请注意,在LogCat中,Android蓝牙堆栈非常嘈杂。这不是你学会忽略的第一行。

答案 2 :(得分:0)

由于BluetoothLeScanner提出的建议与发布的答案不同,因此不确定过去四年是否有人对代码进行了调整。

事实证明,对stopScan()的不当呼叫是罪魁祸首。 如果传入的ScanCallback参数的包装实现是null,则BluetoothLeScanner将打印此日志消息并返回而不停止扫描。 我认为应该将其记录为错误(Log.e)而不是调试日志。

如果以前只调用过stopScan(callback),请确保只调用startScan(callback),从而摆脱了这个麻烦。

答案 3 :(得分:0)

正如很多人所说,此消息通常可以安全地忽略。但是,我遇到了与您类似的问题 - 有时,我使用 BluetoothLeScanner 检测到 0 个 BLE 设备。

查看由 BluetoothLeScanner 类生成的 Logcat 中的 Debug 输出,我看到每当检测到零个设备时,onScannerRegistered() - status=6 scannerId=-1 mScannerId=0。通常,作为参考,输出为 onScannerRegistered() - status=0 scannerId=10 mScannerId=0

查看各种 Github 存储库,我发现这组输出对应于 Android BLE 不支持 在 30 秒内停止/启动扫描超过 5 次的事实。像这样的日志消息通常可以安全地忽略,但查看文档以检查它显示的任何信息总是好的。也许不在此代码片段中,但我希望您会在使用 BLE 时遇到这个问题。