我买了3 kontakt.io iBeacon,我没有问题来创建代码,以便在IOS上扫描它们,但是对于android,我遇到了一些问题。错误是,我可以正确地扫描iBeacons一次,但在此之后,它们不再被扫描,或者在很长一段时间后被扫描,这是我迄今为止使用的代码:
public class BeaconMonitorActivity extends Activity {
private static final int REQUEST_CODE_ENABLE_BLUETOOTH = 1;
private BeaconManager beaconManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
beaconManager = BeaconManager.newInstance(this);
beaconManager.setMonitorPeriod(MonitorPeriod.MINIMAL);
beaconManager.setScanMode(1);
beaconManager.setForceScanConfiguration(ForceScanConfiguration.DEFAULT);
beaconManager.registerMonitoringListener(new BeaconManager.MonitoringListener() {
@Override
public void onMonitorStart() {
}
@Override
public void onMonitorStop() {}
@Override
public void onBeaconsUpdated(final Region region, final List<BeaconDevice> beacons) {}
@Override
public void onBeaconAppeared(final Region region, final BeaconDevice beacon) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(
new Runnable()
{
@Override
public void run()
{
if(beacon.getProximity() == Proximity.IMMEDIATE)
{
if(beacon.getMinor() == 33506)
{
AlertDialog.Builder builder = new AlertDialog.Builder(BeaconMonitorActivity.this);
builder.setMessage("Trovato iBeacon 1")
.setCancelable(false)
.setPositiveButton("Dettagli", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
BeaconMonitorActivity.this.finish();
}
})
.setNegativeButton("Continua lo Scan", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
beaconManager.startMonitoring();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
beaconManager.startMonitoring();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
if(beacon.getMinor() == 16706)
{
AlertDialog.Builder builder = new AlertDialog.Builder(BeaconMonitorActivity.this);
builder.setMessage("Trovato iBeacon 2")
.setCancelable(false)
.setPositiveButton("Dettagli", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
BeaconMonitorActivity.this.finish();
}
})
.setNegativeButton("Continua lo Scan", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
beaconManager.startMonitoring();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
beaconManager.startMonitoring();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
if(beacon.getMinor() == 48997)
{
AlertDialog.Builder builder = new AlertDialog.Builder(BeaconMonitorActivity.this);
builder.setMessage("Trovato iBeacon 3")
.setCancelable(false)
.setPositiveButton("Dettagli", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
BeaconMonitorActivity.this.finish();
}
})
.setNegativeButton("Continua lo Scan", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
try {
beaconManager.startMonitoring();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
beaconManager.startMonitoring();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
}
}
);
}
@Override
public void onRegionEntered(final Region region) {}
@Override
public void onRegionAbandoned(final Region region) {}
});
}
@Override
protected void onStart() {
super.onStart();
if(!beaconManager.isBluetoothEnabled()) {
final Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, REQUEST_CODE_ENABLE_BLUETOOTH);
} else if(beaconManager.isConnected()) {
try {
beaconManager.startRanging();
} catch (RemoteException e) {
e.printStackTrace();
}
} else {
connect();
}
}
@Override
protected void onStop() {
super.onStop();
beaconManager.stopMonitoring();
}
@Override
protected void onDestroy() {
super.onDestroy();
beaconManager.disconnect();
beaconManager = null;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUEST_CODE_ENABLE_BLUETOOTH) {
if(resultCode == Activity.RESULT_OK) {
connect();
} else {
Toast.makeText(this, "Bluetooth not enabled", Toast.LENGTH_LONG).show();
getActionBar().setSubtitle("Bluetooth not enabled");
}
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
private void connect() {
try {
beaconManager.connect(new OnServiceBoundListener() {
@Override
public void onServiceBound() {
try {
beaconManager.startMonitoring();
//beaconManager.startMonitoring(Region.EVERYWHERE);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
} catch (RemoteException e) {
throw new IllegalStateException(e);
}
}
}我是不是在扫描错误的信标?请帮帮忙
发布于 2015-05-11 09:21:05
onStart()中,调用BeaconManager.startRanging()。相反,在onStop()中调用BeaconManager.stopMonitoring()。嗯,这不是那样的。你既可以瞄准也可以监视。你不能同时进行两次扫描。混合测距和监测结果出现异常。
而ranging则专注于与您感兴趣的远程设备之间的物理距离。
然而,如果您monitor他们,您希望得到通知,他们是否在附近。换句话说,不管你是否在特定的区域。
IMMEDIATE距离找到具有特定次要值的信标,就需要执行代码。虽然你所写的应该有效,但解决它并不是更好的方法。您可以通过Filters.newMajorFilter()或通过Filters.CustomFilter对特定值(如未成年人)启用筛选。你见过kontakt-信标-样本-管理-应用程序吗?这个项目演示了kontakt.io的Android使用的不同方法。
https://stackoverflow.com/questions/30121701
复制相似问题