Kontakt.io iBeacon 在 Android 上的扫描间隔太长
Kontakt.io iBeacon gets scanned with too much interval on Android
我买了 3 个 kontakt.io iBeacon,创建代码以便在 IOS 上扫描它们没有问题,但是对于 android 我遇到了一些问题..
错误是我可以正确扫描一次 iBeacon,但之后它们不再被扫描,或者在很长一段时间后才被扫描,这是我到目前为止使用的代码:
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);
}
}
}
我在错误的函数中扫描信标吗?
请帮忙
- 在
onStart()
中调用 BeaconManager.startRanging()
。相反,在 onStop()
中调用 BeaconManager.stopMonitoring()
.
嗯,这样不行。您可以范围或监控。您不能同时执行两种扫描。混合测距和监视会引发异常。
虽然 ranging
您关注与您感兴趣的远程设备的物理距离。
然而,如果您 monitor
他们,您更想知道他们是否在附近。换句话说,你是否在特定地区。
- 我看到您想在从
IMMEDIATE
距离找到具有特定次要值的信标后执行代码。虽然您编写的内容应该有效,但这并不是解决问题的首选方法。您可以通过 Filters.newMajorFilter()
或 Filters.CustomFilter
启用对特定值的过滤,例如次要值
你看过kontakt-beacon-sample-admin-app吗?该项目演示了 kontakt.io 的 Android SDK 用法的不同方法。
我买了 3 个 kontakt.io iBeacon,创建代码以便在 IOS 上扫描它们没有问题,但是对于 android 我遇到了一些问题.. 错误是我可以正确扫描一次 iBeacon,但之后它们不再被扫描,或者在很长一段时间后才被扫描,这是我到目前为止使用的代码:
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);
}
}
}
我在错误的函数中扫描信标吗? 请帮忙
- 在
onStart()
中调用BeaconManager.startRanging()
。相反,在onStop()
中调用BeaconManager.stopMonitoring()
.
嗯,这样不行。您可以范围或监控。您不能同时执行两种扫描。混合测距和监视会引发异常。
虽然 ranging
您关注与您感兴趣的远程设备的物理距离。
然而,如果您 monitor
他们,您更想知道他们是否在附近。换句话说,你是否在特定地区。
- 我看到您想在从
IMMEDIATE
距离找到具有特定次要值的信标后执行代码。虽然您编写的内容应该有效,但这并不是解决问题的首选方法。您可以通过Filters.newMajorFilter()
或Filters.CustomFilter
启用对特定值的过滤,例如次要值
你看过kontakt-beacon-sample-admin-app吗?该项目演示了 kontakt.io 的 Android SDK 用法的不同方法。