使用BeaconManager无法检测到ibeacon

你好,

使用时发现无法检测到ibeacon, 控制台发现有如下错误信息:
com.aprilbrother.aprilbrothersdk.service.BeaconService.g:277 Bluetooth adapter did not start le scan

请问这可能是什么原因引起的?有什么解决方面吗?

多谢

检查蓝牙权限是否添加
你是如何使用的 是运行AprilBeaconDemos示例时遇到还是 自己编码时遇到
手机是否支持BLE 系统是否是4.3及以上
如果不是因为以上原因 手机是否有后台运行的蓝牙应用 这可能会影响开启蓝牙扫描 如果是尝试关闭后台蓝牙应用
如果不是以上原因 尝试重启蓝牙

检查蓝牙权限是否添加

仿照demo已经添加对应的权限和服务

你是如何使用的 是运行AprilBeaconDemos示例时遇到还是 自己编码时遇到
手机是否支持BLE 系统是否是4.3及以上

能正常运行Demo程序,说明手机支持BLE

如果不是因为以上原因 手机是否有后台运行的蓝牙应用 这可能会影响开启蓝牙扫描 如果是尝试关闭后台蓝牙应用

会不会和Demo程序或者是AprilBeacon官方那个应用冲突?*

如果不是以上原因 尝试重启蓝牙

尝试了重启蓝牙,但是手机会自动打开蓝牙。是不是因为后台蓝牙应用的关系?

多谢反馈

把后台运行的服务关闭后是否可以正常检测
正常运行demo的话 能否把代码贴出来看下

你好,

非常感谢您的回复。

在卸载Demo程序以及AprilBeacon官方那个应用后,已经可以检测到beacon。但是发现,在我自己的程序退出后,蓝牙功能无法关闭。再次打开我的程序后,又出现上面类似的 Bluetooth adapter did not start le scan的错误。
这个可能是什么原因引起的?

下面这个文件是具体使用SDK的代码, 请看下是否有疏漏或使用不当的地方。

非常感谢

package com.dytes.railway.beacon;

import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;

import com.aprilbrother.aprilbrothersdk.Beacon;
import com.aprilbrother.aprilbrothersdk.BeaconManager;
import com.aprilbrother.aprilbrothersdk.Region;
import com.dytes.railway.RailwayApplication;
import com.dytes.railway.messaging.CommunicationException;
import com.dytes.railway.messaging.Messenger;
import com.google.inject.Inject;

import java.util.ArrayList;
import java.util.List;

import microsoft.aspnet.signalr.client.Action;
import microsoft.aspnet.signalr.client.ErrorCallback;
import microsoft.aspnet.signalr.client.SignalRFuture;

public class LocationManager {
    private static String TAG = LocationManager.class.getSimpleName();
    private final Context context;
    private final Messenger messenger;
    private BeaconManager manager;
    private Region region = new Region("region", null, null, null);
    private boolean started = false;

    @Inject
    public LocationManager(Context context, Messenger messenger) {
        this.context = context;
        this.messenger = messenger;
        manager = new BeaconManager(context);
    }

    public void stopService() {
        if (!started) {
            Log.i(TAG, "Location service is not running, skip stopping service.");
            return;
        }

        Log.i(TAG, "Stopping location manager.");
        try {
            manager.stopMonitoring(region);
            started = false;
        } catch (RemoteException e) {
            Log.e(TAG, "Failed to stop location manager: " + e.getMessage(), e);
        }

    }

    private String getUserId() {
        return RailwayApplication.Instance.getUserContext().getUser().UserName;
    }


    public boolean hasBluetooth() {
        return manager.hasBluetooth();
    }

    public boolean isBluetoothEnabled() {
        return manager.isBluetoothEnabled();
    }

    public void startService() {
        if (started) {
            Log.i(TAG, "Location service is already running.");
            return;
        }

        Log.i(TAG, "Starting location manager.");

        manager.setForegroundScanPeriod(2000, 0);
        manager.setRangingListener(new BeaconManager.RangingListener() {
            @Override
            public void onBeaconsDiscovered(Region region, List<Beacon> beacons) {
                Log.i(LocationManager.TAG, "Found beacon: " + beacons.size());
                if (beacons.size() > 0) {
                    notifyLocationUpdate(beacons);
                }
            }
        });

        manager.connect(new BeaconManager.ServiceReadyCallback() {
            @Override
            public void onServiceReady() {
                try {
                    manager.startRanging(region);
                    started = true;
                } catch (RemoteException e) {
                    Log.e(TAG, "Failed to start beacon ranging.", e);
                }
            }
        });
    }

    private void notifyLocationUpdate(List<Beacon> beacons) {
        try {
            List<LocationInfo> locations = new ArrayList<>(beacons.size());
            for (Beacon targetedBeacon : beacons) {
                locations.add(LocationInfo.create(targetedBeacon.getMajor(), targetedBeacon.getMinor(), targetedBeacon.getDistance()));
            }
            SignalRFuture<Boolean> future = messenger.updateLocation(getUserId(), locations);
            future.done(new Action<Boolean>() {
                @Override
                public void run(Boolean aBoolean) throws Exception {
                    Log.i(TAG, "Successfully update location");
                }
            });

            future.onError(new ErrorCallback() {
                @Override
                public void onError(Throwable throwable) {
                    Log.e(TAG, "Failed to update location: " + throwable.getMessage(), throwable);
                }
            });
        } catch (CommunicationException e) {
            Log.e(TAG, "Failed to update user location.", e);
        }
    }
}

你传入的Context是什么 如果是Activity的子类 例如ListActivity、FragmentActivity 上下文请使用getApplicationContext()

Context通过依赖注入的,实际值跟getApplicationContext()获取到的值一样。
有其他人遇到类似问题吗?

多谢回复

Log提示Bluetooth adapter did not start le scan有两种可能
1.在蓝牙开启扫描的时候出现异常 这种情况可能是因为蓝牙资源被占用,可以尝试关闭后台蓝牙应用 重启蓝牙
2.传入上下文在绑定服务时无法绑定 这时需使用Service上下文 或者Activity上下文