1

デバイス リストを ArrayAdapter に追加し、デバイス リストが Bluetooth スキャンから取得される ListView に表示します。スキャンされたデバイスは最初に arrayadapter に追加されます。その後、リストビューに追加して、スキャンされたBluetoothデバイスのリストをユーザーに表示します。

しかし、デバイスをスキャンしているときに、重複したデバイスが追加されているとします。デバイスAがスキャンされると、表示されている device の 2 倍または 3 倍になりますA。スキャンしたデバイスのリストを 1 回だけ表示したい。それを達成する方法。質問があいまいな場合は申し訳ありません。

次のコードは、新しいデバイスを照会し、それを arrayadapter に追加するためのものです。

if (BluetoothDevice.ACTION_FOUND.equals(action))
        {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // If it's already paired, skip it, because it's been listed already
            if (device.getBondState() != BluetoothDevice.BOND_BONDED)
            {
                mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress());
            }
        // When discovery is finished, change the Activity title
        } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            setProgressBarIndeterminateVisibility(false);
            setTitle(R.string.select_device);
            if (mNewDevicesArrayAdapter.getCount() == 0) {
                String noDevices = getResources().getText(R.string.none_found).toString();
                mNewDevicesArrayAdapter.add(noDevices);
            }
        }

バージョン 4.1 の Android の例のプログラムで、例の名前はBluetooth Chatです。アクティビティはどこにありますかDeviceListActivityScan.java

4

2 に答える 2

1

このデモを 2 台の電話で実行しましたが、複数回スキャンするのは 1 台だけです。だから私はそれがデバイスに関連していると思います。

あなたはそれを避けるためにそれを行うことができます:

            if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                String deviceInfo = device.getName() + "\n" + device.getAddress();
                if(mNewDevicesArrayAdapter.getPosition(deviceInfo) < 0) {
                    mNewDevicesArrayAdapter.add(deviceInfo);
                }
            }
于 2012-10-19T09:54:50.520 に答える
0

これは、Bluetooth デバイスとその信号強度を表示するために保存したクラスです。

addDeviceRSSI 値の更新が頻繁に行われるため、Bluetooth デバイスが既にメソッド内のリストに存在するかどうかを確認し、その場合のみ RSSI 値を更新します。

public class DeviceListAdapter extends ArrayAdapter<String> {
    private static class ViewHolder {
        ImageView signalImage;
        TextView deviceName;
        TextView deviceAddress;
    }

    private LayoutInflater mInflator;
    // for each BLE device address store the RSSI value and name
    private Map<String, Integer> mRssi = new HashMap<String, Integer>();
    private Map<String, String> mName = new HashMap<String, String>();

    public DeviceListAdapter(Context context) {
        super(context, R.layout.rowlayout);
        mInflator = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addDevice(String address, String name, int rssi) {
        if (mRssi.put(address, rssi) == null) {
            // add a new BLE device to the List
            add(address);
            mName.put(address, name);
        } else {
            // just refresh the List after updating RSSI value
            notifyDataSetChanged();
        }
    }

    // return bitmap resource id for a signal strength
    private int rssi2res(int rssi) {
        if (rssi < -100)
            return R.drawable.signal1;

        if (rssi < -75)
            return R.drawable.signal2;

        if (rssi < -50)
            return R.drawable.signal3;

        return R.drawable.signal4;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder viewHolder;
        // General ListView optimization code.
        if (view == null) {
            view = mInflator.inflate(R.layout.rowlayout, viewGroup, false);
            viewHolder = new ViewHolder();
            viewHolder.signalImage = (ImageView) view.findViewById(R.id.signalImage);
            viewHolder.deviceAddress = (TextView) view.findViewById(R.id.deviceAddress);
            viewHolder.deviceName = (TextView) view.findViewById(R.id.deviceName);
            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }

        String address = getItem(i);

        int rssi = mRssi.get(address);
        viewHolder.signalImage.setImageResource(rssi2res(rssi));

        String name = mName.get(address);
        viewHolder.deviceName.setText(name);

        viewHolder.deviceAddress.setText(address);
        return view;
    }
}
于 2015-11-12T09:25:44.327 に答える