我是一个Android初学者,并且正在Android上测试一些Estimote。我的项目与Estimote图书馆合作,但现在我想尝试更开放的Alt信标库,但我有几个问题。
我的应用程序的功能应该是这样的:当应用程序启动时,BeaconApplication应该启动BeaconsMonitoringService。应对两个区域进行监测。如果输入区域,则服务应使用广播管理器发送意图。有了意图的信息,应该在主活动中选中/不选中复选框。当应用程序被杀死或蓝牙状态发生变化时,服务也会启动。
问题是:
除了onBeaconServiceConnect中的“输入”和“左”之外,还显示了所有调试日志。任何帮助都将不胜感激。希望这只是一个愚蠢的/新手的错误,而且它一般都能工作。:)
这里是我的BeaconApplication:代码
package de.mcd.presencealtbeacon;
import android.app.Application;
import android.content.Intent;
import org.altbeacon.beacon.BeaconManager;
public class BeaconApplication extends Application {
private BeaconManager beaconManager = null;
@Override
public void onCreate() {
super.onCreate();
beaconManager = BeaconManager.getInstanceForApplication(this);
startService(new Intent(getApplicationContext(), BeaconsMonitoringService.class));
}
public BeaconManager getBeaconManager() {
if (beaconManager == null) {
beaconManager = BeaconManager.getInstanceForApplication(this);
}
return beaconManager;
}
}这里是BeaconsMonitoringService:的代码
package de.mcd.presencealtbeacon;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.Identifier;
import org.altbeacon.beacon.MonitorNotifier;
import org.altbeacon.beacon.Region;
import org.altbeacon.beacon.BeaconParser;
public class BeaconsMonitoringService extends Service implements BeaconConsumer {
private static final String UUID = "1234567-1234-1234-1234-123456789012";
private static final Region Room = new Region("mcd", Identifier.parse(UUID), Identifier.fromInt(1), null);
private static final Region Kitchen = new Region("mcd", Identifier.parse(UUID), Identifier.fromInt(2), null);
private static final String TAG = "BEACON";
private BeaconManager beaconManager;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.d(TAG, "Beacons monitoring service started");
}
@Override
public void onDestroy() {
Log.d(TAG, "Beacons monitoring service destroyed");
}
public void onBeaconServiceConnect(){
beaconManager.setMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
Log.d(TAG, "Entered");
if (region.getId2() == Identifier.fromInt(1)) {
postNotification("Room", "Entered");
intent("1-1");
} else {
postNotification("Kitchen", "Entered");
intent("2-1");
}
}
@Override
public void didExitRegion(Region region) {
Log.d(TAG, "Left");
if (region.getId2() == Identifier.fromInt(1)) {
postNotification("Room", "Left");
intent("1-2");
} else {
postNotification("Kitchen", "Left");
intent("2-2");
}
}
@Override
public void didDetermineStateForRegion(int state, Region region) {
Log.d(TAG, "Don't know what it's useful for" + state);
}
});
try {
Log.d(TAG, "Service ready");
beaconManager.startMonitoringBeaconsInRegion(Room);
beaconManager.startMonitoringBeaconsInRegion(Kitchen);
} catch (RemoteException e) {
Log.e(TAG, "Cannot start ranging", e);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStart Start");
BeaconApplication app = (BeaconApplication)getApplication();
beaconManager = app.getBeaconManager();
beaconManager.setBackgroundScanPeriod(1100l);
beaconManager.setBackgroundBetweenScanPeriod(10000l);
beaconManager.getBeaconParsers ().add ( new BeaconParser ().setBeaconLayout (
"m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24" ) );
beaconManager.bind(this);
Log.d(TAG, "onStart End");
Notification noti = new Notification.Builder(this)
.setContentTitle("Started")
.setContentText("Here we go")
.setSmallIcon(R.mipmap.ic_launcher)
.build();
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(2);
mNotificationManager.notify(1, noti);
return START_STICKY;
}
private void postNotification(String room, String action) {
Intent notificationIntent = new Intent(BeaconsMonitoringService.this, MyActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(BeaconsMonitoringService.this, 0,
notificationIntent, 0);
Notification noti = new Notification.Builder(BeaconsMonitoringService.this)
.setContentTitle(room)
.setContentText(action)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(intent)
.build();
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(2);
mNotificationManager.notify(1, noti);
}
private void intent (String code){
Intent intent = new Intent("statechanged");
intent.putExtra("info", code);
LocalBroadcastManager.getInstance(BeaconsMonitoringService.this).sendBroadcast(intent);
}
}发布于 2015-06-19 16:02:40
一个问题是,Region构造函数的第一个参数是一个唯一的字符串,用于标识库中的区域。每个区域必须有一个唯一的字符串,否则当您开始测距或监视时,它将用相同的标识符替换另一个区域。下面的代码对两个区域使用相同的标识符:
private static final Region Room = new Region("mcd", Identifier.parse(UUID), Identifier.fromInt(1), null);
private static final Region Kitchen = new Region("mcd", Identifier.parse(UUID), Identifier.fromInt(2), null);这将导致第二个受监视区域替换下面代码中的第一个区域:
beaconManager.startMonitoringBeaconsInRegion(Room);
beaconManager.startMonitoringBeaconsInRegion(Kitchen);若要解决此问题,请将区域设置更改为:
private static final Region Room = new Region("mcd1", Identifier.parse(UUID), Identifier.fromInt(1), null);
private static final Region Kitchen = new Region("mcd2", Identifier.parse(UUID), Identifier.fromInt(2), null);在一个更基本的层面上,构建一个在后台自动启动的后台服务对于一个自称是初学者的人来说是一项相当高级的任务,可能还有很多其他的问题在代码上并不明显。已经被设计成在后台自动启动并扫描信标,扫描间隔随着应用程序从前景到背景的变化而发生适当的变化。
在参考应用程序这里。中的Application类中可以看到这方面的一个简单示例
我建议您不要使用BeaconMoinitoringService,而是将参考应用程序的Application类中的代码复制到您的BeaconApplication类中。然后,您可以将代码从您的didEnterRegion类移到BeaconApplication类的BeaconApplication和didExitRegion方法中。
如果您更喜欢使用自定义服务的方法,我相信这是可能的,但这可能有点困难。
https://stackoverflow.com/questions/30941304
复制相似问题