Android:AltBeacon未检测到信标

时间:2017-02-10 20:36:31

标签: android altbeacon beacon

我正在使用AltBeacon库从一个简单的信标接近应用程序 https://altbeacon.github.io/android-beacon-library/samples.html

我正在尝试上面网站上提供的示例代码,但是,每次运行应用程序时,它只会转到didDetermineStateForRegion()方法。如果它检测到信标,它将转到didEnterRegion()方法。

我不确定我做错了什么,在其他问题上找不到答案。

上述网站提供的参考应用程序存在同样的问题,但Locate app(基于AltBeacon)会立即检测到我的信标。

我的信标设置为152ms传输间隔和最大传输功率。

这是我的代码:

MainActivity

public class MainActivity extends AppCompatActivity implements BeaconConsumer {
    protected final String TAG = "Beacons Monitoring";
    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:0-3=4c000215,i:4-19,i:20-21,i:22-23,p:24-24"));
        beaconManager.bind(this);
    }

    public void onDestroy(){
        super.onDestroy();
        beaconManager.unbind(this);
    }

    @Override
    public void onBeaconServiceConnect() {
        beaconManager.addMonitorNotifier(new MonitorNotifier() {
            @Override
            public void didEnterRegion(Region region) {
                Log.e(TAG,"I just saw a beacon for the first time");
            }

            @Override
            public void didExitRegion(Region region) {
                Log.e(TAG, "I lost my beacons :( ");
            }
            @Override
            public void didDetermineStateForRegion(int i, Region region) {
                Log.e(TAG, "I just switched from seeing/not seeing a beacon. STATE: " + i);
            }
        });
        try {
            beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null));

        } catch (RemoteException e){
            Log.e(TAG, "EXCEPTION!!! :'( ");
        }
    }
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.michal.beacons2">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <uses-permission android:name="android.permission.BLUETOOTH"/>
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

有谁知道我的代码中可能有什么问题?

2 个答案:

答案 0 :(得分:5)

我设法解决了这个问题。

首先,将信标布局设置为您正在使用的信标类型非常重要。这些是可用的布局:

ALTBEACON       m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25
EDDYSTONE TLM   x,s:0-1=feaa,m:2-2=20,d:3-3,d:4-5,d:6-7,d:8-11,d:12-15
EDDYSTONE UID   s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19
EDDYSTONE URL   s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-20v
IBEACON         m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24

消息来源:https://beaconlayout.wordpress.com/

可以使用以下代码设置布局:

beaconManager.getBeaconParsers().add(new 
BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));

其次,android需要位置权限来检测信标。我通过检查授予和拒绝权限会发生什么来测试这个,但Android Beacon Library网站上也提到了这个要求。我建议按照Google Android开发者培训的说明获取用户的许可: https://developer.android.com/training/permissions/index.html

此外,我已经测试了davidgyoung提供的代码,一旦我设法对其进行排序,它确实按照描述的方式工作,因此我建议在开发阶段将其添加到您的代码中。

所有这一切实际上都在Android Beacon Library网站上得到了清楚解释,但我在某种程度上混淆了一切。我希望这个答案可以帮助将来的某个人。

答案 1 :(得分:1)

了解didEnterRegion回调仅在您 时才会触发。这意味着如果在开发期间重新启动应用程序时信标正在传输,则您将无法获得新的回调。当应用重新启动时,您将始终获得didDetermineStateForRegion()的新回调。

为什么这样工作?由于内存条件较低,Android经常暂时杀死应用程序,并且几分钟后库会自动重启它们以继续寻找信标。如果图书馆没有以这种方式工作,那么应用程序会在每次Android操作系统暂时停止应用程序时反复收到didEnterRegion的回调,并且稍后重新启动,即使信标永远不会消失并重新出现。

这在开发过程中可能令人沮丧,因此可以使用以下代码禁用此功能

beaconManager.setRegionStatePeristenceEnabled(false)

如果你这样做,那么在开始生产之前删除这一行可能是明智的,以防止每次应用被操作系统暂时杀死时多次进入事件。