ALT 信标测距功能不工作
ALT beacon ranging functionality not working
我正在尝试构建一个 android 应用程序,它可以对附近的信标进行测距,并获取相关信息,例如 UUID 和与信标的距离。我现在面临的问题是测距功能根本无法检测到单个信标。我很确定这个功能是正确的,因为我已经下载了另一个类似的演示项目,它可以在同一台设备上很好地扫描信标。
应用程序现在在 beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)) 函数之后完全没有反应,调试器显示线程卡在 didRangeBeaconsInRegion 函数和信标大小始终为 0。
我的代码有问题吗?还是因为我的设置或配置不正确?
代码:
package com.example.ma.contextualawarenessapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.app.Activity;
import android.os.RemoteException;
import android.widget.TextView;
import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.RangeNotifier;
import org.altbeacon.beacon.Region;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Locale;
public class GeofencingActivity extends AppCompatActivity implements BeaconConsumer {
protected static final String TAG = "GeofencingActivity";
private BeaconManager beaconManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_geofencing);
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.bind(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
beaconManager.unbind(this);
}
@Override
protected void onPause() {
super.onPause();
if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(true);
}
@Override
protected void onResume() {
super.onResume();
if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(false);
}
@Override
public void onBeaconServiceConnect() {
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
for (Beacon beacon : beacons) {
logToDisplay(getCurrentTimeStamp() + " | Beacon " + beacon.toString() + " is about " + beacon.getDistance() + " meters away.");
}
/*if (beacons.size() > 0) {
EditText editText = (EditText)GeofencingActivity.this
.findViewById(R.id.geofencingText);
Beacon firstBeacon = beacons.iterator().next();
logToDisplay("The first beacon "+firstBeacon.toString()+" is about "+firstBeacon.getDistance()+" meters away."); }
*/}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
} catch (RemoteException e) { }
}
private void logToDisplay(final String line) {
runOnUiThread(new Runnable() {
public void run() {
TextView editText = (TextView)GeofencingActivity.this
.findViewById(R.id.geofencingText);
editText.append(line+"\n");
}
});
}
private static String getCurrentTimeStamp() {
Locale locale = new Locale("es", "ES");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS", locale);
Date now = new Date();
return sdf.format(now);
}
}
build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.example.ma.contextualawarenessapplication"
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'org.altbeacon:android-beacon-library:2+@aar'
}
buildscript {
repositories {
jcenter()
mavenCentral()
flatDir {
dirs 'libs'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0-alpha5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
无法使用 Android Beacon Library 进行检测时需要检查的几件事:
确保您的信标正在传输 AltBeacon 格式。如果没有,您只需注册一个 BeaconParser
表达式,使其检测 Eddystone 或 iBeacon 等专有信标类型。
如果您不确定所宣传的格式,请尝试使用 Locate app,它会告诉您它检测到的格式。
如果让您无法检测的设备有 Android 6.0+,请确保您已获得位置权限,如 here.
[=27 所述=]
我正在尝试构建一个 android 应用程序,它可以对附近的信标进行测距,并获取相关信息,例如 UUID 和与信标的距离。我现在面临的问题是测距功能根本无法检测到单个信标。我很确定这个功能是正确的,因为我已经下载了另一个类似的演示项目,它可以在同一台设备上很好地扫描信标。
应用程序现在在 beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)) 函数之后完全没有反应,调试器显示线程卡在 didRangeBeaconsInRegion 函数和信标大小始终为 0。
我的代码有问题吗?还是因为我的设置或配置不正确?
代码:
package com.example.ma.contextualawarenessapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.app.Activity;
import android.os.RemoteException;
import android.widget.TextView;
import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.RangeNotifier;
import org.altbeacon.beacon.Region;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Locale;
public class GeofencingActivity extends AppCompatActivity implements BeaconConsumer {
protected static final String TAG = "GeofencingActivity";
private BeaconManager beaconManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_geofencing);
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.bind(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
beaconManager.unbind(this);
}
@Override
protected void onPause() {
super.onPause();
if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(true);
}
@Override
protected void onResume() {
super.onResume();
if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(false);
}
@Override
public void onBeaconServiceConnect() {
beaconManager.setRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
for (Beacon beacon : beacons) {
logToDisplay(getCurrentTimeStamp() + " | Beacon " + beacon.toString() + " is about " + beacon.getDistance() + " meters away.");
}
/*if (beacons.size() > 0) {
EditText editText = (EditText)GeofencingActivity.this
.findViewById(R.id.geofencingText);
Beacon firstBeacon = beacons.iterator().next();
logToDisplay("The first beacon "+firstBeacon.toString()+" is about "+firstBeacon.getDistance()+" meters away."); }
*/}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
} catch (RemoteException e) { }
}
private void logToDisplay(final String line) {
runOnUiThread(new Runnable() {
public void run() {
TextView editText = (TextView)GeofencingActivity.this
.findViewById(R.id.geofencingText);
editText.append(line+"\n");
}
});
}
private static String getCurrentTimeStamp() {
Locale locale = new Locale("es", "ES");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS", locale);
Date now = new Date();
return sdf.format(now);
}
}
build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.example.ma.contextualawarenessapplication"
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'org.altbeacon:android-beacon-library:2+@aar'
}
buildscript {
repositories {
jcenter()
mavenCentral()
flatDir {
dirs 'libs'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0-alpha5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
无法使用 Android Beacon Library 进行检测时需要检查的几件事:
确保您的信标正在传输 AltBeacon 格式。如果没有,您只需注册一个
BeaconParser
表达式,使其检测 Eddystone 或 iBeacon 等专有信标类型。如果您不确定所宣传的格式,请尝试使用 Locate app,它会告诉您它检测到的格式。
如果让您无法检测的设备有 Android 6.0+,请确保您已获得位置权限,如 here.
[=27 所述=]