0
我买了3 kontakt.io iBeacon,我没有问题创建的代码,以便在IOS上扫描它们,但对于Android我有一些问题.. 该错误是,我能够正确扫描iBeacons一次,但之后,他们并没有得到了扫描或他们得到的很长一段时间后,扫描,这是到目前为止,我使用的代码:Kontakt.io iBeacon扫描在Android上的间隔太多
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);
}
}
}
我是否在错误的功能中扫描信标? 请帮助
有很多帮助!你能解释一下为什么同时执行这两种方法是不正确的吗? 当我找到一个灯塔并询问用户他是否想继续扫描时(通过这种方式我没有任何延迟发现灯塔),我通过使用stopMonitoring()和startMonitoring()得到了代码工作,您认为有更清晰的解决方案? Ty为链接。我很快就会查出来的! – Signo
我已经更新了我的答案。有关更多信息,请参阅http://docs.kontakt.io或https://github.com/kontaktio –
好的非常感谢您的帮助! – Signo