我最近开始测试 Estimote Beacons,我试图在进入信标区域时从后台服务启动通知,但不幸的是我的解决方案不起作用。它不会给出错误,但在发现信标时不会启动通知。我不知道这是一些代码错误还是只是这样做的方式是错误的。我读过this other question但它似乎有点不同,因为我使用的是服务而不是活动,但也许答案是相似的(与应用程序上下文相关)......
这是我的服务代码
public class BeaconsMonitoringService extends Service{
private BeaconManager beaconManager;
private String user;
@Override
public void onCreate() {
// Configure BeaconManager.
beaconManager = new BeaconManager(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Beacons monitoring service starting", Toast.LENGTH_SHORT).show();
user = intent.getStringExtra("user");
// Check if device supports Bluetooth Low Energy.
if (!beaconManager.hasBluetooth()||!beaconManager.isBluetoothEnabled()) {
Toast.makeText(this, "Device does not have Bluetooth Low Energy or it is not enabled", Toast.LENGTH_LONG).show();
this.stopSelf();
}
connectToService();
// If we get killed, after returning from here, restart
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// We don't provide binding, so return null
return null;
}
@Override
public void onDestroy() {
Toast.makeText(this, "Beacons monitoring service done", Toast.LENGTH_SHORT).show();
}
private void connectToService() {
beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
@Override
public void onServiceReady() {
notifyEnterRegion(0);
// try {
beaconManager.setBackgroundScanPeriod(TimeUnit.SECONDS.toMillis(1), 0);
Log.i("BEACOON ", "ANTES DE");
beaconManager.setMonitoringListener(new MonitoringListener() {
@Override
public void onEnteredRegion(Region region, List<Beacon> beacons) {
Log.i("BEACOON ", String.valueOf(beacons.get(1).getMinor()));
for (Beacon beacon: beacons){
Log.i("BEACOON ", String.valueOf(beacon.getMinor()));
if (beacon.getMinor() == 64444) {
notifyEnterRegion(6444);
} else if (beacon.getMinor() == 36328) {
notifyEnterRegion(36328);
} else if (beacon.getMinor() == 31394) {
notifyEnterRegion(31394);
}
}
}
@Override
public void onExitedRegion(Region region) {
notifyExitRegion();
}
});
}
});
}
public void notifyEnterRegion(int code) {
Toast.makeText(this, "Beacon "+code, Toast.LENGTH_SHORT).show();
Intent targetIntent = new Intent(this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, targetIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification noti = new Notification.Builder(this)
.setContentTitle("Bienvenido "+user+"!")
.setContentText("Sólo por estar aquí has ganado....")
.setSmallIcon(com.smt.beaconssmt.R.drawable.beacon_gray)
.setContentIntent(contentIntent)
.getNotification();
NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nManager.notify(1, noti);
}
public void notifyExitRegion(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Hasta pronto!")
.setTitle(user+", estás abandonando la zona de beacons");
builder.setPositiveButton("Ver web", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User clicked OK button
Intent i = new Intent(BeaconsMonitoringService.this, WebViewActivity.class);
i.putExtra("web", "http://www.google.com/");
startActivity(i);
}
});
builder.setNegativeButton("Adios!", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
}
我将非常感谢任何形式的帮助,在此先感谢!