借助Google 的新 Eddystone 标准,他们将在 Google Play 服务Nearby Api中提供对 android 的支持。我们是否可以注册 eddystone 信标并让我们的应用程序接收到意图,即使应用程序没有运行?
问问题
3121 次
3 回答
5
是的,使用完全支持Eddystone的Android Beacon Library可以做到这一点。
后台启动应用程序的机制在 Eddystone 上的工作方式与在库支持的其他类型的信标上的工作方式相同。您在自定义类中使用RegionBootstrap
对象。您可以在此处Application
阅读有关其工作原理的详细信息。
与 Eddystone 的唯一区别是您必须设置一个BeaconParser
解码 Eddystone-UID 帧的,然后设置一个Region
与您的 Eddystone 命名空间 id 匹配的:
public class MyApplicationName extends Application implements BootstrapNotifier {
private static final String TAG = ".MyApplicationName";
private RegionBootstrap regionBootstrap;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "App started up");
BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
// Detect the main identifier (UID) frame:
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19"));
// wake up the app when a beacon matching myEddystoneNamespaceId is seen
myEddystoneNamespaceId = Identifier.parse("0x2f234454f4911ba9ffa6");
Region region = new Region("com.example.myapp.boostrapRegion", myEddystoneNamespaceId, null, null);
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
}
}
于 2015-07-14T18:15:51.287 回答
1
好的,所以这很痛苦,但我终于设法使用Nearby Messages API检测到信标。
- 首先创建一个谷歌开发者控制台项目
- 为您刚刚创建的项目启用“附近消息 API”
- 为该项目创建一个 API 密钥,如此处所述,并将其添加到 Manifest
- 按照此处所述配置和注册您的信标;我要做的是安装 Android 应用程序,打开它,选择我刚刚创建的项目,发现信标并将其注册到我的应用程序
- 您必须在信标上附加一条消息,才能检测到它。我使用Beacon Tools 应用程序执行此操作,单击注册的信标,然后点击“附件”
现在您可以按照此处的代码示例进行操作,它应该会检测到您的信标
Nearby.Messages.subscribe(googleApiClient, new MessageListener() { @Override public void onFound(Message message) { Log.i(TAG, "Found : " + message); } @Override public void onLost(Message message) { Log.i(TAG, "Lost : " + message); } }, new SubscribeOptions.Builder() .setStrategy(Strategy.BLE_ONLY) .build());
于 2016-05-25T12:24:39.010 回答
0
自 Google play services v8.4 SDK(2015 年 12 月)发布以来,这已经成为可能。
有关更多信息,请参见以下链接: http ://android-developers.blogspot.com/2015/12/google-play-services-84-sdk-is-available_18.html
于 2016-03-07T16:14:38.920 回答