2014-09-01 44 views
2

我使用的是参考,http://altbeacon.github.io/android-beacon-library/samples.html。我也用How to detect Region Enter/Exit for multiple beacons using AltBeacon android-beacon-library?如何让AltBeacon库的BootstrapRegion识别iBeacon布局?

我试图在使用AltBeacon的Android信标库的背景中检测iBeacons。我包含了我的项目中的以下代码片段。到目前为止,我没有检测到在后台ibeacons ...任何帮助表示赞赏

我使用BeaconManager到

setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 

但是,我没有错误,没有信标检测。在Samsung Galaxy 4设备上运行应用程序调试时,应用程序将启动,但不会检测活动信标。我的信标是配置为iBeacons的Rad Beacons。 Rad Beacon应用程序检测到它们,我的其他AltBeacon库应用程序在前台运行,并检测到我的iBeacons。这些应用程序在三星Galaxy 4上运行。

我为背景信号检测设置的应用程序...未检测到iBeacons。

这是我的代码。对Constants.java的引用只是我的应用程序的一个常量文件。

package com.myApp.BTleDemo; 

import android.app.Application; 
import android.content.Intent; 
import android.util.Log; 

import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 
import java.util.Locale; 



import org.altbeacon.beacon.startup.BootstrapNotifier; 
import org.altbeacon.beacon.startup.RegionBootstrap; 
import org.altbeacon.beacon.Region; 
import org.altbeacon.beacon.BeaconConsumer; 
import org.altbeacon.beacon.BeaconManager; 
import org.altbeacon.beacon.BeaconParser; 
import org.altbeacon.beacon.MonitorNotifier; 
import org.altbeacon.beacon.RangeNotifier; 
import org.altbeacon.beacon.Region; 
import org.altbeacon.beacon.Identifier; 




public class BackgroundMode extends Application implements BootstrapNotifier{ 
    private static final String TAG = ".BackgroundMode"; 
    private RegionBootstrap regionBootstrap; 

    private BeaconManager beaconManager; 
SharedPreferences prefs; 
List<Region> regions; 
    public void onCreate() { 
     super.onCreate(); 
    Log.d(TAG, "App started up"); 


    beaconManager = BeaconManager.getInstanceForApplication(this); 
    // Add AltBeacons Parser for iBeacon 
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 


    // wake up the app when any beacon is seen (you can specify specific id filers in the parameters below) 

    Region region = new Region("com.myApp.BTleDemo.boostrapRegion", Identifier.parse(Constants.BT_UUID), 
    Identifier.fromInt(Constants.BT_MAJOR), Identifier.fromInt(Constants.BT_MINOR)); 

     regionBootstrap = new RegionBootstrap(this, region); 


} 


@Override 
public void didDetermineStateForRegion(int arg0, Region arg1) { 
    // Don't care 
} 

@Override 
public void didEnterRegion(Region arg0) { 
    Log.d(TAG, "Got a didEnterRegion call"); 

    // This call to disable will make it so the activity below only gets launched the first time a beacon is seen (until the next time the app is launched) 
    // if you want the Activity to launch every single time beacons come into view, remove this call. 
    regionBootstrap.disable(); 
    Intent intent = new Intent(this, MainActivity.class); 
    // IMPORTANT: in the AndroidManifest.xml definition of this activity, you must set android:launchMode="singleInstance" or you will get two instances 
    // created when a user launches the activity manually and it gets launched from here. 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    this.startActivity(intent); 
} 

@Override 
public void didExitRegion(Region arg0) { 
    // Don't care 
} 


/* 
@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) { } 
} 
} 
*/ 
} 

我没有收到任何ibeacon检测。没有发布预期的LogCat清单。我错过了一些步骤?

+0

如果你在前台运行应用程序,你会得到检测结果吗?你在用什么IDE?如果使用Eclipse,是否可以验证在project.properties中启用了清单合并? – davidgyoung 2014-09-01 17:18:26

+0

@davidgyoung我没有在前景或背景中获取信标检测。我正在使用Eclipse。在project.properties中自动生成文本文件列表target = android-18 android.library.reference.1 = ../../android-beacon-library – user3337849 2014-09-02 13:09:10

+0

你有另一个设备可以测试吗?我之前在三星设备上使用iBeacon时遇到过问题(GT-N7105,GT-N7505都有我的Nexus没有的问题)。 – 2014-09-02 15:23:58

回答

4

编辑您的project.properties文件,并添加一行:

manifestmerger.enabled=true 

查看完整说明在这里:

http://altbeacon.github.io/android-beacon-library/configure.html

的问题无关,与你想信标类型认识。如果未启用清单合并,则您的AndroidManifest.xml文件没有从库中继承的服务定义来启动BeaconService,因此不会检测到任何类型的信标。

使用Eclipse,您可以通过执行构建来判断清单合并是否正常工作,然后查看bin/AndroidManifest.xml中生成的清单。该清单应包含以下条目。

如果一切都失败了,你可以将这些条目复制到您的项目清单手动:

<uses-permission android:name="android.permission.BLUETOOTH"/> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

<!-- nest the entries below underneath your application tag --> 

    <service android:enabled="true" android:exported="true" android:isolatedProcess="false" android:label="beacon" android:name="org.altbeacon.beacon.service.BeaconService"> 
    </service> 
    <service android:enabled="true" android:name="org.altbeacon.beacon.BeaconIntentProcessor"> 
    </service> 
    <receiver android:name="org.altbeacon.beacon.startup.StartupBroadcastReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
      <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> 
      <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> 
     </intent-filter> 
    </receiver> 
+0

我手动编辑了project.properties并添加了manifestmerger.enabled = true。仍然无法检测到信标。问题:由于project.properties是自动生成的,为什么我们需要手动编辑它? – user3337849 2014-09-03 12:32:14

+0

在答案中查看我的编辑,了解如何检查清单合并是否正常,以及如果失败,该怎么办。确实,使用Eclipse向导时project.properties是自动生成的,但它仍然是一个配置文件,可能需要根据项目需求进行自定义。 – davidgyoung 2014-09-03 13:12:53

+0

谢谢......我确认了构建正在按照上面的说明生成正确的合并。感谢您坚持这个问题,直到解决...信标正在被发现。再次感谢!!! – user3337849 2014-09-03 13:55:07

3

如果不检测所有信标,以确保库的BeaconService正在运行,并且它注意到蓝牙设备。要做到这一点,在你的应用程序或活动的onCreate方法将线像下面启用调试日志记录:

mBeaconManager.setDebug(true); 

运行你的应用程序,同时捕捉的logcat的结果。你应该找像下面的那些线条告诉你,如果BeaconService成功启动:

I/BeaconService(7140): beaconService version 2.0-beta4 is starting up 
I/BeaconService(7140): binding 
I/BeaconService(7140): start ranging received 
D/BeaconService(7140): Currently ranging 1 regions. 

如果你看到这样的线路,那么这意味着该服务成功启动。然后打开你的信,寻找类似下面的线条,它会告诉你你是否在所有检测的蓝牙设备,以及它们是否被认定为信标:

D/BtGatt.GattService(2006): onScanResult() - address=00:07:80:02:60:20, rssi=-65 
D/BeaconService(1772): got record 
D/BeaconParser(1772): This is a recognized beacon advertisement -- beac seen 
D/BeaconService(1772): beacon detected multiple times in scan cycle :id1: 2f234454-cf6d-4a0f-adf2-f4911ba9ffa6 id2: 1 id3: 3 


D/BtGatt.GattService(2006): onScanResult() - address=D4:CB:08:6F:DA:AD, rssi=-82 
D/BeaconService(7140): got record 
D/BeaconParser(7140): This is not a matching Beacon advertisement. (Was expecting be ac. The bytes I see are: 0201061aff0000001012f234454cf6d4a0fadf2f4911ba9ffa600010001b90000000000000000000000000000000000000000000000000000000000000000 

第一片段展示了一个成功的解码一个被识别为信标的蓝牙设备。第二个片段显示检测到不被识别为信标的蓝牙设备。如果您没有看到任何代码片段,则表示该服务没有运行,或者根本没有检测到蓝牙设备。

一旦您获得像这样的LogCat捕获,请将其摘录添加到您的问题,这可以帮助进一步排除故障。