2016-07-03 52 views
0

我正尝试使用以下代码扫描Android中的其他蓝牙设备。 但没有任何事情被触发,也没有检测到设备。BLE扫描不适用于Android

import android.annotation.TargetApi; 
import android.app.Activity; 
import android.bluetooth.BluetoothAdapter; 
import android.bluetooth.BluetoothDevice; 
import android.bluetooth.BluetoothGatt; 
import android.bluetooth.BluetoothGattCallback; 
import android.bluetooth.BluetoothGattCharacteristic; 
import android.bluetooth.BluetoothGattService; 
import android.bluetooth.BluetoothManager; 
import android.bluetooth.BluetoothProfile; 
import android.bluetooth.le.BluetoothLeScanner; 
import android.bluetooth.le.ScanCallback; 
import android.bluetooth.le.ScanFilter; 
import android.bluetooth.le.ScanResult; 
import android.bluetooth.le.ScanSettings; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.List; 

@TargetApi(21) 
public class MainActivity extends ActionBarActivity { 
    private BluetoothAdapter mBluetoothAdapter; 
    private int REQUEST_ENABLE_BT = 1; 
    private Handler mHandler; 
    private static final long SCAN_PERIOD = 1000000; 
    private BluetoothLeScanner mLEScanner; 
    private ScanSettings settings; 
    private List<ScanFilter> filters; 
    private BluetoothGatt mGatt; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mHandler = new Handler(); 
     if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { 
      Toast.makeText(this, "BLE Not Supported", 
        Toast.LENGTH_SHORT).show(); 
      finish(); 
     } 
     final BluetoothManager bluetoothManager = 
       (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); 
     mBluetoothAdapter = bluetoothManager.getAdapter(); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); 
     } else { 
      if (Build.VERSION.SDK_INT >= 21) { 
       mLEScanner = mBluetoothAdapter.getBluetoothLeScanner(); 
       settings = new ScanSettings.Builder() 
         .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) 
         .build(); 
       filters = new ArrayList<ScanFilter>(); 
      } 
      scanLeDevice(true); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) { 
      scanLeDevice(false); 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     if (mGatt == null) { 
      return; 
     } 
     mGatt.close(); 
     mGatt = null; 
     super.onDestroy(); 
    } 

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

    private void scanLeDevice(final boolean enable) { 
     if (enable) { 
      mHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        if (Build.VERSION.SDK_INT < 21) { 
         mBluetoothAdapter.stopLeScan(mLeScanCallback); 
        } else { 
         mLEScanner.stopScan(mScanCallback); 

        } 
       } 
      }, SCAN_PERIOD); 
      if (Build.VERSION.SDK_INT < 21) { 
       mBluetoothAdapter.startLeScan(mLeScanCallback); 
      } else { 
       //mLEScanner.startScan(filters, settings, mScanCallback); 
       mLEScanner.startScan(mScanCallback); 
      } 
     } else { 
      if (Build.VERSION.SDK_INT < 21) { 
       mBluetoothAdapter.stopLeScan(mLeScanCallback); 
      } else { 
       mLEScanner.stopScan(mScanCallback); 
      } 
     } 
    } 


    private ScanCallback mScanCallback = new ScanCallback() { 
     @Override 
     public void onScanResult(int callbackType, ScanResult result) { 
      Log.i("callbackType", String.valueOf(callbackType)); 
      Log.i("result", result.toString()); 
      BluetoothDevice btDevice = result.getDevice(); 
      connectToDevice(btDevice); 
     } 

     @Override 
     public void onBatchScanResults(List<ScanResult> results) { 
      for (ScanResult sr : results) { 
       Log.i("ScanResult - Results", sr.toString()); 
      } 
     } 

     @Override 
     public void onScanFailed(int errorCode) { 
      Log.e("Scan Failed", "Error Code: " + errorCode); 
     } 
    }; 

    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() { 
          Log.i("onLeScan", device.toString()); 
          connectToDevice(device); 
         } 
        }); 
       } 
      }; 

    public void connectToDevice(BluetoothDevice device) { 
     if (mGatt == null) { 
      mGatt = device.connectGatt(this, false, gattCallback); 
      scanLeDevice(false);// will stop after first device detection 
     } 
    } 

    private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { 
     @Override 
     public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
      Log.i("onConnectionStateChange", "Status: " + status); 
      switch (newState) { 
       case BluetoothProfile.STATE_CONNECTED: 
        Log.i("gattCallback", "STATE_CONNECTED"); 
        gatt.discoverServices(); 
        break; 
       case BluetoothProfile.STATE_DISCONNECTED: 
        Log.e("gattCallback", "STATE_DISCONNECTED"); 
        break; 
       default: 
        Log.e("gattCallback", "STATE_OTHER"); 
      } 

     } 

     @Override 
     public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
      List<BluetoothGattService> services = gatt.getServices(); 
      Log.i("onServicesDiscovered", services.toString()); 
      gatt.readCharacteristic(services.get(1).getCharacteristics().get 
        (0)); 
     } 

     @Override 
     public void onCharacteristicRead(BluetoothGatt gatt, 
             BluetoothGattCharacteristic 
               characteristic, int status) { 
      Log.i("onCharacteristicRead", characteristic.toString()); 
      gatt.disconnect(); 
     } 
    }; 
} 

我有这些在清单。 添加了粗略的位置,因为它需要BLE准确度。

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

<uses-feature android:name="android.hardware.bluetooth_le" 
       android:required="true" /> 
+0

[PLZ检查它。](https://stackoverflow.com/questions/43114913/android-7-0-ble-scan-no-result/44471774#44471774) 在我的情况帮助我。 –

回答

2

你需要检查的几件事。

  • 您的Android设备是否支持BLE? 这种用途(getPackageManager()。hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE))
  • 如果Android版本是6.0,然后允许位置访问形式-Settings->应用
    • 确保你的位置是启用的Android设备。
+0

我做了两个,仍然没有检测到任何设备。还有什么我需要照顾的。你能否检查一下上面的代码是否有问题。谢谢 – Vipin