1

RÉPONSE: Un grand merci à Nelson Hoang ci-dessous pour me diriger dans la bonne direction et fournir des ressources valuble. Une fois que le code pour ajouter des autorisations pour les emplacements a été ajouté (voir Edit2 ci-dessous), j'ai dû entrer manuellement dans le réglage et changer les autorisations de localisation pour l'application. Une fois cela fait, ça fonctionnait très bien.Bluetooth Le Gatt ne pas trouver tous les périphériques

Question: Je tente de me connecter à des appareils Bluetooth LE en utilisant le Bluetooth LE Gatt standard du studio android. Je suis obligé de mettre à jour gradle de 2.8 à 2.10 à chaque fois. Je l'ai fait automatiquement et manuellement sur différents projets.

Cependant, une fois que j'ai cette application téléchargée sur mon Galaxy S7, il scanne et ne trouve rien malgré 3 appareils Bluetooth LE radiodiffusion juste à côté d'eux. Je sais que ce n'est pas un problème matériel avec mon S7 parce que j'ai utilisé Bluefruit LE et j'ai été capable de capter les signaux et de me connecter très bien. Des solutions?

Edit: Comme suggéré je posterai le code de balayage ci-dessous. Cependant, rien de tout cela n'a été écrit par moi. Voici l'exemple de code Bluetooth LE auquel vous pouvez accéder depuis Android Studio.

Edit2: Pour accorder les autorisations de l'application locatin j'ai ajouté au manifeste:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 

Ce fut en plus des paquets Bluetooth habituels mais il n'a pas changé quoi que ce soit.

package com.example.android.bluetoothlegatt; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothManager; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 

/** 
* Activity for scanning and displaying available Bluetooth LE devices. 
*/ 
public class DeviceScanActivity extends ListActivity { 
    private LeDeviceListAdapter mLeDeviceListAdapter; 
    private BluetoothAdapter mBluetoothAdapter; 
    private boolean mScanning; 
    private Handler mHandler; 

    private static final int REQUEST_ENABLE_BT = 1; 
    // Stops scanning after 10 seconds. 
    private static final long SCAN_PERIOD = 10000; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getActionBar().setTitle(R.string.title_devices); 
     mHandler = new Handler(); 

     // Use this check to determine whether BLE is supported on the device. Then you can 
     // selectively disable BLE-related features. 
     if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { 
      Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); 
      finish(); 
     } 

     // Initializes a Bluetooth adapter. For API level 18 and above, get a reference to 
     // BluetoothAdapter through BluetoothManager. 
     final BluetoothManager bluetoothManager = 
       (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
     mBluetoothAdapter = bluetoothManager.getAdapter(); 

     // Checks if Bluetooth is supported on the device. 
     if (mBluetoothAdapter == null) { 
      Toast.makeText(this, R.string.error_bluetooth_not_supported, Toast.LENGTH_SHORT).show(); 
      finish(); 
      return; 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     if (!mScanning) { 
      menu.findItem(R.id.menu_stop).setVisible(false); 
      menu.findItem(R.id.menu_scan).setVisible(true); 
      menu.findItem(R.id.menu_refresh).setActionView(null); 
     } else { 
      menu.findItem(R.id.menu_stop).setVisible(true); 
      menu.findItem(R.id.menu_scan).setVisible(false); 
      menu.findItem(R.id.menu_refresh).setActionView(
        R.layout.actionbar_indeterminate_progress); 
     } 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_scan: 
       mLeDeviceListAdapter.clear(); 
       scanLeDevice(true); 
       break; 
      case R.id.menu_stop: 
       scanLeDevice(false); 
       break; 
     } 
     return true; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Ensures Bluetooth is enabled on the device. If Bluetooth is not currently enabled, 
     // fire an intent to display a dialog asking the user to grant permission to enable it. 
     if (!mBluetoothAdapter.isEnabled()) { 
      if (!mBluetoothAdapter.isEnabled()) { 
       Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
       startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
      } 
     } 

     // Initializes list view adapter. 
     mLeDeviceListAdapter = new LeDeviceListAdapter(); 
     setListAdapter(mLeDeviceListAdapter); 
     scanLeDevice(true); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // User chose not to enable Bluetooth. 
     if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) { 
      finish(); 
      return; 
     } 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     scanLeDevice(false); 
     mLeDeviceListAdapter.clear(); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     final BluetoothDevice device = mLeDeviceListAdapter.getDevice(position); 
     if (device == null) return; 
     final Intent intent = new Intent(this, DeviceControlActivity.class); 
     intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_NAME, device.getName()); 
     intent.putExtra(DeviceControlActivity.EXTRAS_DEVICE_ADDRESS, device.getAddress()); 
     if (mScanning) { 
      mBluetoothAdapter.stopLeScan(mLeScanCallback); 
      mScanning = false; 
     } 
     startActivity(intent); 
    } 

    private void scanLeDevice(final boolean enable) { 
     if (enable) { 
      // Stops scanning after a pre-defined scan period. 
      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        mScanning = false; 
        mBluetoothAdapter.stopLeScan(mLeScanCallback); 
        invalidateOptionsMenu(); 
       } 
      }, SCAN_PERIOD); 

      mScanning = true; 
      mBluetoothAdapter.startLeScan(mLeScanCallback); 
     } else { 
      mScanning = false; 
      mBluetoothAdapter.stopLeScan(mLeScanCallback); 
     } 
     invalidateOptionsMenu(); 
    } 

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

     public LeDeviceListAdapter() { 
      super(); 
      mLeDevices = new ArrayList<BluetoothDevice>(); 
      mInflator = DeviceScanActivity.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(); 
     } 

     @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, null); 
       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 = mLeDevices.get(i); 
      final String deviceName = device.getName(); 
      if (deviceName != null && deviceName.length() > 0) 
       viewHolder.deviceName.setText(deviceName); 
      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, int rssi, byte[] scanRecord) { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        mLeDeviceListAdapter.addDevice(device); 
        mLeDeviceListAdapter.notifyDataSetChanged(); 
       } 
      }); 
     } 
    }; 

    static class ViewHolder { 
     TextView deviceName; 
     TextView deviceAddress; 
    } 
} 
+0

Pouvez-vous publier le code de numérisation ici? – reTs

Répondre

6

Avez-vous l'emplacement activé? Les appareils Android 6.0 et versions supérieures doivent être allumés pour pouvoir rechercher les périphériques Bluetooth LE. Bluetooth Low Energy startScan on Android 6.0 does not find devices

+0

J'ai l'emplacement sur et juste essayé à nouveau. Pas de chance encore. Merci pour le conseil! –

+1

Ça a marché! J'ai dû ajouter du code pour accorder les autorisations de l'application et donner manuellement les autorisations de localisation de l'application dans les paramètres. Une fois cela terminé, il a finalement commencé à capter les signaux! Merci encore Nelson Hoang! –