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이라는 하나의 인스턴스를 만들고이를 스캔 논리에서 사용하십시오.

+0

내 첫 번째 생각 이었지만 'ScanCallback'의 동일한 인스턴스를 항상 사용하고 있습니다. – tharun

+0

이 조각'개인 ScanCallback scanCallback = 새로운 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()를 호출 할 때 :하지ScanPeriod에서

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() 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