2017-08-05 4 views
0

Bluetoothデバイスをスキャンするとき、ArrayList内の各デバイスをMACアドレスで取得しようとしています。後でリストの中で最も強い信号RSSIに接続したいと思います。何らかの理由で、RSSIは以下のコードで更新し続けます。データがArrayListに配置される唯一の時間は、MACが別のリストに含まれていないときです。Android/Java - アクセスできないArrayListでBluetooth RSSIをアップデートする

基本的に、私はリストにあるものに対してスキャンするMACアドレスをチェックし、そのリストにない場合、デバイス情報を別のArrayListに追加します。

deviceArray ArrayListでRSSIがまだ更新されているのはなぜですか?

// Device Discovery 
private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() { 
    @Override 
    public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) { 

     if (device.getName() != null){ 
      if (DEVICE_NAME.equals(device.getName())){ 

       deviceInfo[0] = device.getName(); 
       deviceInfo[1] = device.getAddress(); 
       deviceInfo[2] = Integer.toString(rssi); 

       // Add device info if MAC address is not located 
       if (!MACAddresses.contains(deviceInfo[1])){ 
        deviceArray.add(deviceInfo); 
        MACAddresses.add(deviceInfo[1]); 
        Log.e("MAC ADDRESS ADDING", "ADDING " + deviceInfo[1]); 
       } 

       // TODO remove this logging info 
       for(int i = 0; i < deviceArray.size(); i++){ 
        Log.e("Bluetooth Devices", 
          "Array Length = " + deviceArray.size() + ", " 
          + deviceArray.get(i)[0] + ", " 
          + deviceArray.get(i)[1] + ", " 
          + deviceArray.get(i)[2]); 
       } 
      } 
     } 

以下の出力をご覧ください。 ArrayListのサイズは2で、MACアドレスは2つしかありませんが、RSSIは時々変更されます。 3つのRSSI値(-41、-47、および-48)があり、2つの値しかないことに注意してください。これに加えて、これらのArrayListアイテムが順番にプリントアウトされていないということは私には奇妙に思えます。 1つのMACアドレスがAで、もう1つがBの場合は、AB、AB、AB、ABのように印刷する必要がありますが、AB BA AB BAのようになり、ある時点でAAAAがあります。

E/MAC ADDRESS ADDING: ADDING 00:A0:50:CC:4B:9B 
E/Bluetooth Devices: Array Length = 1, MyDeviceName, 00:A0:50:CC:4B:9B, -41 
E/MAC ADDRESS ADDING: ADDING 00:A0:50:12:14:96 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:12:14:96, -48 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:12:14:96, -48 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:CC:4B:9B, -41 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:CC:4B:9B, -41 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:12:14:96, -48 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:12:14:96, -48 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:CC:4B:9B, -41 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:CC:4B:9B, -41 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:12:14:96, -47 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:12:14:96, -48 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:CC:4B:9B, -41 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:CC:4B:9B, -41 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:CC:4B:9B, -41 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:CC:4B:9B, -41 
E/Bluetooth Devices: Array Length = 2, MyDeviceName, 00:A0:50:12:14:96, -47 

私が貼り付けなかった出力では、さらにRSSI値(-58と-53)が実際に表示されます。私はちょうど私がMACごとに一度項目を追加していない場合、これらがどのようにArrayListにすることができます理解していない。何かご意見は?

答えて

0

私はこれを考え出しました。私は記憶場所が良くないので、自分のコードで間違いを犯しました。クラス変数では、文字列配列を作成していました:しかし、このメソッドは同じメモリ位置を使用していて、データを上書きすることができました。さらに、私のデバイスアレイは実際には同じMACアドレスのうちの2つを格納していましたが、どちらも役に立ちませんでした。これが私が後で問題を発見した方法です。

いずれにしても、新しいループ位置を取得できるように、各ループのコールバックメソッド内に新しいString配列を宣言する必要がありました。

関連する問題