0

私はしばらくの間この作業をしていましたが、ネット上の複数のソースからのコードをまとめましたが、まだ結果は得られません。Bluetooth LEデバイスを表示して接続できないのはなぜですか? (Android)

当初、私は今、私は、リストビューを使用しようとしましたBLEデバイスをスキャンし、オーバーフローメニューでそれらを表示し、そこから接続しようとしていたが、それは仕事を得ることができませんでした...

デバイスは、まだ運がない。私はこれに新しいので、何が何にリンクしているかは完全にはわかりません。 startDiscoveryを使用してスキャンを開始することはできますが、何もクラッシュすることはありませんが、運はありません。

可能な限り多くのコードを提供しようとしますが、どこに問題があるのか​​わかりません。これは大学の割り当てです。

BroadcastReceiverを追加しようとしましたが、何も変更されていません SensorTagデバイスに接続し、GATT接続を介してセンサーの読み取り値を受信することを意図しています。私はそれを含めていないので、それは接続プロセスの一部を果たしていると思う。

@Override 
 
protected void onCreate(Bundle savedInstanceState) { 
 
    super.onCreate(savedInstanceState); 
 
    setContentView(R.layout.activity_scan); 
 
    vHandler = new Handler(); 
 

 
    BluetoothManager manager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE); // access bluetooth manager 
 
    vBluetoothAdapter = manager.getAdapter(); 
 

 
    vTags = new ArrayList <BluetoothDevice>(); // store bluetooth devices 
 

 

 
    // Initialise list view adapter 
 
    ListView vListView = (ListView) findViewById(R.id.list); 
 
    vLeDeviceListAdapter = new LeDeviceListAdapter(); 
 
    vListView.setAdapter(vLeDeviceListAdapter); 
 

 
    IntentFilter vfilter = new IntentFilter(); 
 
    vfilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); 
 
    vfilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
 
    vfilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 
 
    vfilter.addAction(BluetoothDevice.ACTION_FOUND); 
 

 
} 
 

 

 
//Device Scan Callback 
 
private BluetoothAdapter.LeScanCallback vLeScanCallback = 
 
    new BluetoothAdapter.LeScanCallback() { 
 

 
    @Override 
 
    public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { 
 
     runOnUiThread(new Runnable() { 
 
     @Override 
 
     public void run() { 
 
      vLeDeviceListAdapter.addDevice(device); 
 
      vLeDeviceListAdapter.notifyDataSetChanged(); 
 
     } 
 
     }); 
 

 
     Log.i(TAG, "New LE Device: " + device.getName() + " @ " + rssi); 
 
    } 
 
    }; 
 

 

 
private void scanLeDevice(final boolean enable) { 
 
    int SCAN_PERIOD = 10000; 
 

 
    if (enable) { 
 
    // Stops scanning after a pre-defined scan period. 
 
    vHandler.postDelayed(new Runnable() { 
 
     @Override 
 
     public void run() { 
 
     vScanning = false; 
 
     stopScan(); 
 
     invalidateOptionsMenu(); 
 
     } 
 
    }, SCAN_PERIOD); 
 
    vScanning = true; 
 
    startScan(); 
 
    } else { 
 
    vScanning = false; 
 
    stopScan(); 
 
    } 
 
    invalidateOptionsMenu(); 
 
} 
 

 

 
// Adapter for holding devices found through scanning. 
 
private class LeDeviceListAdapter extends BaseAdapter { 
 
    private ArrayList <BluetoothDevice> vLeDevices; 
 
    private LayoutInflater vInflator; 
 

 
    LeDeviceListAdapter() { 
 
    super(); 
 
    vLeDevices = new ArrayList < >(); 
 
    vInflator = Activity_Scan.this.getLayoutInflater(); 
 
    } 
 

 
    void addDevice(BluetoothDevice device) { 
 
    if (!vLeDevices.contains(device)) { 
 
     vLeDevices.add(device); 
 
    } 
 
    } 
 

 
    public BluetoothDevice getDevice(int position) { 
 
    return vLeDevices.get(position); 
 
    } 
 

 
    void clear() { 
 
    vLeDevices.clear(); 
 
    } 
 

 
    @Override 
 
    public int getCount() { 
 
    return vLeDevices.size(); 
 
    } 
 

 
    @Override 
 
    public Object getItem(int i) { 
 
    return vLeDevices.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 = vInflator.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); 
 
     view.setTag(viewHolder); 
 
    } else { 
 
     viewHolder = (ViewHolder) view.getTag(); 
 
    } 
 

 
    BluetoothDevice device = vLeDevices.get(i); 
 
    final String deviceName = device.getName(); 
 
    if (deviceName != null && deviceName.length() > 0) 
 
     viewHolder.deviceName.setText(deviceName); 
 
    else 
 
     viewHolder.deviceName.setText(R.string.unknown); 
 
    viewHolder.deviceAddress.setText(device.getAddress()); 
 

 
    return view; 
 
    } 
 
} 
 

 
static class ViewHolder { 
 
    TextView deviceName; 
 
    TextView deviceAddress; 
 
}

答えて

1

あなたは近くのBLEデバイスを表示する場所の設定を有効にする必要があります。実行時の場所のアクセス権を要求することも、手動で有効にすることもできます。

+0

これはそうだった - これのためにほぼ4ヶ月が無駄になった!!それはあなたのためのプログラミングです – Cizzle

関連する問題