当前位置: 首页 > 知识库问答 >
问题:

AltBeacon正在停止信标扫描。但继续扫描

田骁
2023-03-14

出现此问题后,总是进行扫描。
此问题将关闭设备上的蓝牙。或者退出应用程序就会解决。当我让程序运行12小时时,出现了此问题。
似乎很少出现此问题,但我不知道是什么引发了此问题。
有人能帮助我解决此问题吗?
下面列出了终端信息、源代码和日志。

箭头M03
Android OS 6.0
'org.altbeacon:Android-beacon-library:2.16.2'

主体活动

public class MainActivity extends AppCompatActivity implements BeaconConsumer {

private BeaconManager beaconManager;
Region mRegion;

@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=0215,i:4-19,i:20-21,i:22-23,p:24-24"));
    beaconManager.getBeaconParsers().remove(0);
    beaconManager.setForegroundBetweenScanPeriod(4000);

    mRegion = new Region("ibeacon", null, null, null);

    Button btnFore = (Button) findViewById(R.id.btnFore);
    btnFore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            beaconManager.bind(MainActivity.this);
            beaconManager.setDebug(true);
        }
    });

    thdWriteLog l_thdWriteLog = new thdWriteLog();
    l_thdWriteLog.start();
}

@Override
public void onBeaconServiceConnect() {
    beaconManager.addMonitorNotifier(new MonitorNotifier() {
        @Override
        public void didEnterRegion(Region region) {}

        @Override
        public void didExitRegion(Region region) {}

        @Override
        public void didDetermineStateForRegion(int i, Region region) {}
    });

    try {
        beaconManager.startMonitoringBeaconsInRegion(mRegion);
    } catch (RemoteException e) {
        e.printStackTrace();
    }

    beaconManager.addRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {}
    });
}
public class thdWriteLog extends Thread {

@Override
public void run() {
    java.lang.Process proc = null;
    BufferedReader reader = null;
    PrintWriter writer = null;

    final String pId =  Integer.toString(android.os.Process.myPid());

    try {
        proc = Runtime.getRuntime().exec(new String[] { "logcat", "-v", "time"});
        reader = new BufferedReader(new InputStreamReader(proc.getInputStream()), 1024);
        String line;

        while ( true ) {

            line = reader.readLine();
            if (line.length() == 0) {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                }
                continue;
            }

            if (line.indexOf(pId) != -1) {

                try {
                    OutputStream out;
                    File l_file = new File(Environment.getExternalStorageDirectory().getPath() + "/log.text");

                    out = new FileOutputStream(l_file, true);
                    writer = new PrintWriter(new OutputStreamWriter(out,"UTF-8"));

                    String l_time = line.substring(0, 18);
                    String l_logType = line.substring(19, 21);
                    String l_logStr1 = line.substring(21, line.indexOf("):") + 2);
                    String l_logStr2 = line.substring(line.indexOf("):") + 3);
                    String l_logStr = l_time + ',' + l_logType + ',' + l_logStr1 + ',' + l_logStr2;

                    writer.println(l_logStr);
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (writer != null) {
                        writer.close();
                    }
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

共有1个答案

解飞语
2023-03-14

在日志中显示的情况下,向底层Android API发出的停止扫描的命令失败了:

08:54:22.813 D/CycledLeScannerForLollipop(21211): Stopping LE scan on scan handler
08:54:22.814 D/BluetoothAdapter(21211): STATE_ON
08:54:22.814 D/BluetoothLeScanner(21211): could not find callback wrapper
08:54:23.430 E/ CycledLeScannerForLollipop(21211): Scan failed: app cannot be registered

上面最后一行写着“扫描失败”,这实际上是指试图停止扫描。

这肯定是测试设备上蓝牙堆栈内部的问题。由于Android bluetooth堆栈和底层bluetooth芯片之间的接口总是涉及到OEM的一些专有定制,这很可能是由于该实现中的一些bug造成的。

 类似资料:
  • 我一直在使用Android AltBeacon库来监控和定位附近的iBeacons。该应用程序的一个特定要求是允许扫描信标检测,即使当应用程序在后台时也允许扫描信标检测,并且当应用程序关闭时完全停止扫描信标检测。 据我所知,这个需求可以通过bootstrapnotifier/regionbootstrap部分满足,但是扫描服务即使在应用程序关闭时也会重新启动,这是我不希望发生的。

  • 为此,我创建了一个名为的单例。这个类处理所有的输入阅读内容。我创建了一个名为的方法,它将回调作为参数。在这个方法中,我创建了一个新线程,并在其中等待使用的输入。这个类还有方法,它向上面描述的线程发送中断消息。下面是该类的当前实现: 这个代码极不可靠。我一会儿就告诉你我的意思。我制作了一个名为Client的玩具类,在中,我用计时器模拟了消息收入。 以下是它的工作原理: 我知道这个问题非常长(也许是不

  • 我对编程相当陌生。目前我正在做一个uni项目,用java创建一个基本的文本游戏。我遇到的问题是,如何实现一个不允许用户输入相同名称的业务规则。我把它设置好了,这样扫描仪就可以读取阵列了。我使用的是Java,这是我第一次使用这个论坛,所以我非常感谢大家提供的帮助,并提前感谢大家!:) 并为糟糕的格式道歉,我不知道如何正确发布。

  • 如果我需要监视UUID的特定区域。 另一个问题,图书馆是否按位置查找信标? 非常感谢,问候

  • 问题内容: 我的PC上没有太多内存,处理器也很弱。尽管到目前为止,netbeans是我最喜欢的IDE,但在我现有的计算机上使用它几乎是难以忍受的,因为打开程序时,项目扫描会自动开始。 有没有办法防止Netbeans扫描项目? 问题答案: 嗨,乔治,我不知道这是否是答案,但是我右键单击并在不需要打开的项目上选择“关闭”。将您过去的所有项目都列出在那里是没有意义的。只需将您正在开发的那个打开。您始终可

  • 问题内容: 我试图在Go中编写一个扫描程序,以扫描连续行,并在返回之前清理掉行,以便您可以返回逻辑行。因此,给定以下SplitLine函数(Play): 我希望代码返回类似以下内容: 但是,它在返回第一行后停止。第二个电话返回。 任何人有任何想法,还是一个错误? 问题答案: 我认为这是一个错误,因为即使返回的令牌为nil(bufio.SplitFunc),也不会将Advance value> 0用