android - 如何使用 ALT 信标根据距离在回收站视图中显示检测到的信标
问题描述
嗨,我正在使用 ALT 信标库开发一个 android 应用程序。我需要根据距离在回收站视图中显示检测到的信标。附近的距离信标需要首先显示在列表中。我已经完成了一切但我得到了空白页。信标没有显示在 recyclerview 中。请帮助我。
ArrayList<Beacon> data;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
recyclerView = findViewById(R.id.Recyclerview_tab);
bt_stop = findViewById(R.id.bt_stop);
bt_start = findViewById(R.id.bt_start);
beaconManager = BeaconManager.getInstanceForApplication(this);
beaconManager.getBeaconParsers().add(new BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25"));
beaconManager.setBackgroundBetweenScanPeriod(30000l);
beaconManager.setForegroundBetweenScanPeriod(10000l);
region = new Region("myMonitoringUniqueId", null, null, null);
适配器=新信标适配器(此);recyclerView.setAdapter(适配器);
bt_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
beaconManager.bind(Main2Activity.this);
Toast.makeText(Main2Activity.this, "clicked", Toast.LENGTH_SHORT).show();
}
});
bt_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
beaconManager.unbind(Main2Activity.this);
}
});
}
@Override
public void onBeaconServiceConnect() {
final Region region = new Region("myBeaons", Identifier.parse("e2c56db5-dffb-48d2-b060-d0f5a71096e0"), null, null);
beaconManager.addMonitorNotifier(new MonitorNotifier() {
@Override
public void didEnterRegion(Region region) {
try {
Log.d(TAG, "didEnterRegion");
beaconManager.startRangingBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void didExitRegion(Region region) {
try {
Log.d(TAG, "didExitRegion");
beaconManager.stopRangingBeaconsInRegion(region);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void didDetermineStateForRegion(int i, Region region) {
}
});
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if (beacons.size() > 0) {
适配器.initAll(信标);
Log.i(TAG, "我看到的第一个信标大约在 "+beacons.iterator().next().getDistance()+" 米外。"); } adapter.notifyDataSetChanged();
}
});
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
} catch (RemoteException e) { }
}
我的适配器代码:
public class Beaconadapter extends RecyclerView.Adapter<Beaconadapter.Myviewholder> {
Context mcontext;
public static ArrayList<Beacon> beacons;
private LayoutInflater inflater;
public Beaconadapter(Context mcontext) {
this.mcontext = mcontext;
this.beacons = new ArrayList<Beacon>();
this.inflater = LayoutInflater.from(mcontext);
}
@NonNull
@Override
public Myviewholder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v= LayoutInflater.from(mcontext).inflate(R.layout.beaconrecyclerview,viewGroup,false);
Myviewholder myviewholder=new Myviewholder(v);
return myviewholder; }
@Override
public void onBindViewHolder(@NonNull Myviewholder myviewholder, int i) {
myviewholder.tv_uuid.setText(beacons.get(i).getServiceUuid());
myviewholder.tv_macid2.setText(beacons.get(i).getBluetoothAddress());
myviewholder.tv_rssi2.setText((int) beacons.get(i).getDistance());
}
@Override
public int getItemCount() {
return beacons.size();
}
公共无效initAll(集合newBeacons){
this.beacons.clear();
this.beacons.addAll(newBeacons);
}
公共静态类 Myviewholder 扩展 RecyclerView.ViewHolder{ TextView tv_uuid,tv_macid2,tv_rssi2;
public Myviewholder(@NonNull View itemView) {
super(itemView);
this.tv_uuid=itemView.findViewById(R.id.tv_uuid);
this.tv_macid2=itemView.findViewById(R.id.tv_macid2);
this.tv_rssi2=itemView.findViewById(R.id.tv_rssi2);
}
}
}
解决方案
一些提示:
将开始范围的代码移动到
didDetermineStateForRegion
. 如果您在开始监控时已经“在区域内”,您将不会收到新的回调到didEnterRegion
. 你总是得到一个回调到didDetermineStateForRegion
.在每个回调方法的顶部添加调试行。然后运行您的代码以确定调用哪些方法:
onBeaconServiceConnected
,didEnterRegion
,didDetermineStateForRegion
,didRangeBeaconsInRegion
被调用。如果事件链中的一个方法没有被调用,请尝试找出原因。每次你得到一个回调工作,重复上面的步骤 2。这是调试程序的久经考验的真正方法。
推荐阅读
- javascript - 我想在导航栏的右侧显示一些项目
- tomcat - chown -R vs chmod 777 -Rf,tomcat catalina.sh 权限被拒绝
- javascript - gltf-js-utils 在 Node.js 中设置纹理
- javascript - 如何获取 p 标签内的动态 id 或输入类型的动态值
- excel - 重命名文件夹中的多个文件
- python - 如何使用 pytorch 创建的模型(model.pt)将学习迁移到使用 keras 训练新数据集的新模型?
- c++ - 使用 libxml2 的 XML 模式类型信息
- angular - 为 PrimeNG 表格式化 Angular 可观察数据
- qt - 如何让 QML Designer 显示按钮图标?
- .net - .NET 5 SDK 可以用来编译 .NET Core 3.1 项目吗?