0

デバイスを見つけたり、10秒後にBLEデバイスをスキャンしようとしていますが、スキャンを停止しようとしています。しかし何らかの理由で、onBatchScanResultsが無期限に呼び出されています。ScanCallback onBatchScanResultsが無期限に呼び出されています

スキャンを停止しても、スキャンされた結果のキューが排除されるまで、onBatchScanResultsが呼び出されることがわかりました。しかし、私の場合、それは決して止まらない。以下は私がこれを達成しようとしているコードです。

public void scan() { 
    scanner = BluetoothLeScannerCompat.getScanner(); 
    final ScanSettings settings = new ScanSettings.Builder() 
      .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).setReportDelay(1000).setUseHardwareBatchingIfSupported(false).build(); 
    final List<ScanFilter> filters = new ArrayList<>(); 
    filters.add(new ScanFilter.Builder().setServiceUuid(new ParcelUuid(getFilterUUID())) 
      .build()); 
    Log.e(TAG, "Scanning....."); 
    scanner.startScan(filters, settings, scanCallback); 

    mIsScanning = true; 
    mHandler.postDelayed(() -> { 
     if (mIsScanning) { 
      showToast("Not able to find any new device."); 
      stopScan(); 
     } 
    }, SCAN_DURATION); 
} 

private void stopScan() { 
    if (mIsScanning) { 
     final BluetoothLeScannerCompat scanner = BluetoothLeScannerCompat.getScanner(); 
     scanner.stopScan(scanCallback); 
     mIsScanning = false; 
     closeWaitDialog(); 
} 

private ScanCallback scanCallback = new ScanCallback() { 
    @Override 
    public void onScanResult(final int callbackType, final ScanResult result) { 
     // do nothing 
     stopScan(); 
    } 

    @Override 
    public void onBatchScanResults(final List<ScanResult> results) { 
     Log.e(TAG, results.toString() + " mIsScanning " + mIsScanning); 
     if (results.size() == 1) { 
      stopScan(); 
      ScanResult scanResult = results.get(0); 
      launchSomeActivity(); 
     } else if (results.size() > 1) { 
      stopScan(); 
      showToast("Too many new devices. Please scan one device at a time."); 
     } else { 
      // Do nothing. As we will stop anyway stop scanning after 5 sec. 
     } 
    } 

    @Override 
    public void onScanFailed(final int errorCode) { 
     // should never be called 
    } 
}; 

何か助けていただければ幸いです。

答えて

0

nexus 5xのアップデートを入手した後、何らかの理由で問題が解決しました。私の電話だけと関係がありますか?

私の電話が正常に動作しているように見えてから、他の電話でこれを実行しようとしましたが、この問題はないようです。

0

ScanCallbackの新しいインスタンスを作成していて、以前のインスタンスへの参照が失われています。そのため、古いインスタンスの場合はScanCallbackを停止できません。 クラスの先頭にScanCallBackのインスタンスを1つ作成し、スキャンロジック全体で使用してください。

+0

これも私の最初の考えでしたが、私はいつも 'ScanCallback'の同じインスタンスを使用しています。 – tharun

+0

この部分の 'Private ScanCallback scanCallback = new ScanCallback()'は、そうしないと言います。 scanCallbackを呼び出すときにScanCallbackの新しいインスタンスを作成しています –

+0

私は変数を一度だけ宣言していて、常に同じインスタンスを使用しています。コードが少し混乱しているかもしれませんが、scanCallback変数はグローバル変数か何かが欠けています。 – tharun

0

まず、stopScan()を何度も呼び出しています。そして、stopScan()では、新しいインスタンスBluetoothLeScannerCompatを作成して、同じ名前のscannerを作成しています。さらにstopScan()ScanCallbackから呼び出すのは良い方法ではありません。ここ は作業例です:

BluetoothLeScannerCompat scanner; 
public void scan() { 
    scanner = BluetoothLeScannerCompat.getScanner(); 
    ScanSettings settings = new ScanSettings.Builder() 
      .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).setReportDelay(10) 
      .build(); 
    List<ScanFilter> filters = new ArrayList<>(); 
    filters.add(new ScanFilter.Builder().setServiceUuid(new ParcelUuid(mUUid)).build()); 
    scanner.startScan(filters,settings, scanCallback); 


    final Handler handle = new Handler(); 
    handle.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      stopScan(); 
     } 
    },2000); 
} 

private void stopScan() { 
    Log.i("Device Found: ", "Scan Stoped"); 
     scanner.stopScan(scanCallback); 
} 

private ScanCallback scanCallback = new ScanCallback() { 
    @Override 
    public void onScanResult(final int callbackType, final ScanResult result) { 
    } 

    @Override 
    public void onBatchScanResults(final List<ScanResult> results) { 
     Log.i("Device Found: ", results.size()+""); 
    } 

    @Override 
    public void onScanFailed(final int errorCode) { 
     // should never be called 
    } 
}; 

ログ

あなたはscanCallbackからStopScan()を呼び出すとき:

01-17 14:52:53.870 32434-32434/com.dleague.salman.example I/OnBatchScan:      
Scanning... 
01-17 14:52:53.870 32434-32434/com.dleague.salman.example I/StopScan:  
Scanning Stop... 
01-17 14:52:53.881 32434-32434/com.dleague.salman.example I/OnBatchScan: 
Scanning... 
01-17 14:52:53.881 32434-32434/com.dleague.salman.example I/StopScan: 
Scanning Stop... 
01-17 14:52:53.892 32434-32434/com.dleague.salman.example I/OnBatchScan: 
Scanning... 
01-17 14:52:53.892 32434-32434/com.dleague.salman.example I/StopScan: 
Scanning Stop... 
01-17 14:52:53.902 32434-32434/com.dleague.salman.example I/OnBatchScan: 
Scanning... 
01-17 14:52:53.902 32434-32434/com.dleague.salman.example I/StopScan: 
Scanning Stop... 
01-17 14:52:53.912 32434-32434/com.dleague.salman.example I/OnBatchScan: 
Scanning... 
01-17 14:52:53.912 32434-32434/com.dleague.salman.example I/StopScan: 
Scanning Stop... 
01-17 14:52:53.923 32434-32434/com.dleague.salman.example I/OnBatchScan: 
Scanning... 

そして、あなたStopScan()ScanPeriod内ないからscanCallback:

01-17 14:55:10.703 1673-1673/com.dleague.salman.example I/OnBatchScan: 
Scanning... 
01-17 14:55:10.714 1673-1673/com.dleague.salman.example I/OnBatchScan:  
Scanning... 
.... 
01-17 14:55:12.684 1673-1673/com.dleague.salman.example I/OnBatchScan: 
Scanning... 
01-17 14:55:12.694 1673-1673/com.dleague.salman.example I/OnBatchScan: 
Scanning... 
01-17 14:55:12.700 1673-1673/com.dleague.salman.example I/StopScan: Scanning 
Stop... 
+0

スキャンのコールバックでスキャンを停止するのは良い習慣ではないのはなぜですか? – Emil

+0

[Documentation](https://developer.android.com/guide/topics/connectivity/bluetooth-le.html)のスニペットでは、スキャンを開始および停止する方法が示されています。そして、彼らは期間中の走査は良い方法だと言いました。プラス[this](https://devzone.nordicsemi.com/question/19156/start-stop-scanning-in-android-app/)の回答を確認してください。私は間違っている可能性がありますが、それは私の理解であり、私が間違っている場合は私を導く。 –

+0

ドキュメントには、要求されたデバイスが見つかったときにスキャンを停止する必要があることが明確に記載されています(明らかにスキャンを続ける理由はありません)。もちろんこれはコールバックから行うことができます。 – Emil

関連する問題