2017-11-29 5 views
0

Bluetooth低エネルギーに問題があります。すべてが正常に動作しているようです。Bluetooth低エネルギースキャナが正常に動作しているようですが、デバイスが見つからない

ロガーには次のように表示されます。onClientRegistered() - status=0 clientIf=7 mClientIf=0はステータスが成功したことを示し、clientif = 6はクライアントインターフェイスを示します。

スキャナが正常に動作しています。問題は、デバイスが見つからないということです。

マニフェストにはBLUETOOTH, BLUETOOTH_ADMIN, ACCESS_COARSE_LOCATIONの権限があります。アプリの起動時にチェックします。 「スキャン結果がありません」という問題が発生した人は誰でも、ロケーションを有効にするという返事を得る。私はそれをして、まだ何もしなかった。

onScanResults決して成功しません。

私はアンドロイド7.0.0を使用しています。

class MainActivity : AppCompatActivity(), AnkoLogger { 

    lateinit var bleManager: BluetoothManager 
    lateinit var bleAdapter: BluetoothAdapter 
    lateinit var bleScanner: BluetoothLeScanner 

    val REQUEST_BLUETOOTH = 0 
    val REQUEST_COARSE_LOCATION = 1 

    val ui by lazy { MainUI() } 
    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
     ui.setContentView(this) 

     checkLocationPerm() 

     bleManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager 
     bleAdapter = bleManager.adapter 
     bleScanner = bleAdapter.bluetoothLeScanner 

     checkEnableBluetooth() 

     ui.scanButton.onClick { 
      startScan() 
     } 
    } 


    fun checkLocationPerm() { 
     val perm = PermissionChecker.checkSelfPermission(applicationContext, Manifest.permission.ACCESS_COARSE_LOCATION) 
     if (perm == PermissionChecker.PERMISSION_GRANTED) { 
      info("Location permission granted") 
     } else requestEnableLocation() 
    } 

    fun requestEnableLocation() = requestPermissions(arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), 
      REQUEST_COARSE_LOCATION) 

    fun checkEnableBluetooth() { 
     if (!bleAdapter.isEnabled) { 
      val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) 
      startActivityForResult(enableBtIntent, REQUEST_BLUETOOTH) 
      info("Requested user to enable bluetooth.") 
     } 
    } 

    fun startScan() { 
     var scanResults = mutableMapOf<String?, BluetoothDevice?>() 
     var bleScanCallback = BleScanCallback(scanResults) 
     bleScanner.startScan(bleScanCallback) 
    } 


    class BleScanCallback(resultMap: MutableMap<String?, BluetoothDevice?>) : ScanCallback(), AnkoLogger { 

     var resultOfScan = resultMap 

     override fun onScanResult(callbackType: Int, result: ScanResult?) { 
      addScanResult(result) 
      info("I found a ble device ${result?.device?.address}") 

     } 

     override fun onBatchScanResults(results: MutableList<ScanResult>?) { 
      info("I found a device!") 
     } 

     override fun onScanFailed(errorCode: Int) { 
      info("Bluetooth LE scan failed. Error code: $errorCode") 
     } 

     fun addScanResult(scanResult: ScanResult?) { 
      val bleDevice = scanResult?.device 
      val deviceAddress = bleDevice?.address 
      resultOfScan.put(deviceAddress, bleDevice) 
     } 
    } 
} 

私は、Bluetoothデバイスのアドレスを記録したいだけです。 BleScanCallbackオブジェクトをチェックしても問題ありません。私は自分のコードに何が間違っているのか分かりません。

+0

nRF Connectのような別のBLEスキャンアプリケーションを使用している場合、デバイスがそこに表示されますか? – Emil

+0

@Emil nRF Connectは何も表示しません。なぜダニー?私が自分の携帯電話でBluetooth設定を行って手動でスキャンすると、他の2台の電話が検出されます(どちらもBLEをサポートしています)。そして別のことがあります、昨日私はこの電話の1つを見つけることができましたが、今日私のアプリはそれらを検出しません。 – dawzaw

+0

近くに広告BLEデバイスがあり、そこに表示されない場合は、携帯電話/ OSに何か問題があります。バグまたは設定の一部が誤って設定されています。 – Emil

答えて

0

Bluetooth Low Energyをサポートしている電話機は表示されません。私がGATTサーバーとsimutしたとき、私のアプリはこの電話を見つけました。

関連する問題