![](/img/trans.png)
[英]Reading RSSI value of connected Bluetooth Low Energy device in Android Studio
[英]Bluetooth Low Energy Rssi Android
我正在開發一個必須連接到Android 4.3上的Bluetooth Low Energy設備的應用程序。 我試圖這樣做以在我的應用程序中顯示rssi,但是它不起作用
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
//final LeDeviceListAdapter deviceLe = new LeDeviceListAdapter(device, rssi, scanRecord);
runOnUiThread(new Runnable() {
@Override
public void run() {
mLeDeviceListAdapter.addDevice(device,rssi);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
我的列表適配器代碼是:
private class LeDeviceListAdapter extends BaseAdapter {
private ArrayList<BluetoothDevice> mLeDevices;
private LayoutInflater mInflator;
public LeDeviceListAdapter() {
super();
mLeDevices = new ArrayList<>();
mInflator = MainActivity.this.getLayoutInflater();
}
public void addDevice(BluetoothDevice device) {
if (!mLeDevices.contains(device)) {
mLeDevices.add(device);
}
}
public BluetoothDevice getDevice(int position) {
return mLeDevices.get(position);
}
public void clear() {
mLeDevices.clear();
// notifyDataSetChanged();
}
@Override
public int getCount() {
return mLeDevices.size();
}
@Override
public Object getItem(int i) {
return mLeDevices.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
// General ListView optimization code.
if (view == null) {
view = mInflator.inflate(R.layout.listitem_device,viewGroup, false);
viewHolder = new ViewHolder();
viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);
viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name);
// viewHolder.signal = (TextView) view.findViewById(R.id.device_signal);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
BluetoothDevice device = mLeDevices.get(i);
//final String rssi_s=device.getRssi();
final String deviceName = device.getName();
/* ScanResult rssi=null;
final double rssi_s = rssi.getRssi();
String rssiString = String.valueOf(rssi_s);*/
//final String rssiString =getString(valueOf(rssi_s));
if
(deviceName != null && deviceName.length() > 0){
viewHolder.deviceName.setText(deviceName);
// viewHolder.signal.setText(rssiString);
}
else
viewHolder.deviceName.setText(R.string.unknown_device);
viewHolder.deviceAddress.setText(device.getAddress());
return view;
}
}
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
//final LeDeviceListAdapter deviceLe = new LeDeviceListAdapter(device, rssi, scanRecord);
runOnUiThread(new Runnable() {
@Override
public void run() {
// String rssi_signal=String.valueOf(rssi);
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};
static class ViewHolder {
TextView deviceName;
TextView deviceAddress;
//TextView signal;
}
你有什么主意我可以顯示嗎? 我仍然需要在oncreate方法中鍵入此內容嗎?
mLeDeviceListAdapter=new LeDeviceListAdapter();
您的問題是(1)適配器本身沒有用於跟蹤RSSI值的方法,並且(2)您適配器的列表項視圖無法顯示RSSI值,並且適配器本身沒有用於跟蹤RSSI值的方法RSSI值。 這里是詳細的問題:
問題1列表適配器不能跟蹤RSSI值。
您通過以下調用將設備和RSSI值添加到適配器:
mLeDeviceListAdapter.addDevice(device,rssi);
但是適配器只有這樣的方法:
public void addDevice(BluetoothDevice device) {
if (!mLeDevices.contains(device)) {
mLeDevices.add(device);
}
}
如您所見,方法不匹配。 我建議執行以下操作:首先創建一個新類,該類將同時包含BluetoothDevice和RSSI值。 像這樣:
private class LeScanRecord {
public final BluetoothDevice device;
public final int rssi;
public LeScanRecord(BluetoothDevice device, int rssi) {
this.device = device;
this.rssi = rssi;
}
}
然后將您的適配器更改為接受新類的跟蹤實例(請注意,此問題通過使用RSSI值填充文本字段來解決問題2 ):
/**
* Adapter for the scan record devices
*/
private class LeDeviceListAdapter extends ArrayAdapter<LeScanRecord >
{
/**
* View inflater
*/
private final LayoutInflater inflater;
public LeDeviceListAdapter ()
{
super(MainActivity.this, R.layout.listitem_device);
inflater = MainActivity.this.getLayoutInflater();
}
@Override
public void add(LeScanRecord object)
{
for (int i = 0; i < getCount(); i++)
{
if (getItem(i).device.equals(object.device))
{
return; // do not add duplicates
}
}
super.add(object);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
// General ListView optimization code.
if (view == null) {
view = mInflator.inflate(R.layout.listitem_device,viewGroup, false);
viewHolder = new ViewHolder();
viewHolder.deviceAddress = (TextView) view.findViewById(R.id.device_address);
viewHolder.deviceName = (TextView) view.findViewById(R.id.device_name);
viewHolder.rssi= (TextView) view.findViewById(R.id.device_signal);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
LeScanRecord record = getItem(position);
final String deviceName = record.device.getName();
if (deviceName != null && deviceName.length() > 0){
viewHolder.deviceName.setText(deviceName);
}
else {
viewHolder.deviceName.setText(R.string.unknown_device);
}
viewHolder.deviceAddress.setText(record.device.getAddress());
viewHolder.rssi.setText(Integer.valueOf(record.rssi));
return view;
}
}
static class ViewHolder {
public TextView deviceName;
public TextView deviceAddress;
public TextView rssi;
}
最后要做的是將掃描記錄的實例添加到適配器。 所以改變:
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
//final LeDeviceListAdapter deviceLe = new LeDeviceListAdapter(device, rssi, scanRecord);
runOnUiThread(new Runnable() {
@Override
public void run() {
mLeDeviceListAdapter.addDevice(device,rssi);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
至:
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLeDeviceListAdapter.add(new LeScanRecord(device, rssi));
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.