Android Ble -Scan -Rückruf scheinbar nicht genanntAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Android Ble -Scan -Rückruf scheinbar nicht genannt

Post by Anonymous »

Ich möchte einen BTLE -Scan in einem ViewModel ausführen. Ich bin mir nicht sicher, ob dies der beste Ansatz ist, aber es ist ein gutes Lernexperiment für mich. Ich habe es gelungen, meine BT -Geräte erfolgreich aufzulisten, wenn ich den Scan in einem einfacheren Setup ausführte. Fordern Sie bei Bedarf Berechtigungen an. Ich habe auch eine Überschreibung für OnRequestPermissionsResult . Die Standortberechtigungen werden in den Berechtigungen meiner App angezeigt. Diese Methoden sind mehr oder weniger eine Kopie/Einfügung von Open-Source-Projekten (siehe dies). Das Anmelden in meinem Rückruf zeigt nie in meinen Protokollen. Es gibt keinen Fehler, das einzig verdächtige Ding, das ich in den Protokollen sehe, ist Folgendes: D/BluetoothleScanner: OnScannerregister ()-Status = 0 Scannerid = 12 mscannerid = 0 .

Code: Select all

interface ScanningStatus {
void setCurrentlyScanning(boolean updatedStatus);
boolean getCurrentlyScanning();
}

public class SettingsScanningViewModel extends AndroidViewModel {
private MutableLiveData mDeviceList;
private ArrayList mInternalDeviceList;
private MutableLiveData mIsScanning;

private static final String TAG = "viewmodel";

private BluetoothManager mBtManager;
private BluetoothAdapter mBtAdapter;
private BluetoothLeScanner mBleScanner;
private static final long SCAN_PERIOD = 5000;

public SettingsScanningViewModel(Application mApplication) {
super(mApplication);
mDeviceList = new MutableLiveData();
mInternalDeviceList = new ArrayList();
mIsScanning = new MutableLiveData();

mBtManager = (BluetoothManager) mApplication.getSystemService(Context.BLUETOOTH_SERVICE);
mBtAdapter = mBtManager.getAdapter();
mBleScanner = mBtAdapter.getBluetoothLeScanner();
}

MutableLiveData getBtDevices() {
return mDeviceList;
}

MutableLiveData getScanningStatus() {
return mIsScanning;
}

private void flushList() {
mInternalDeviceList.clear();
mDeviceList.setValue(mInternalDeviceList);
}

private void injectIntoList(BluetoothDevice btDevice) {
mInternalDeviceList.add(btDevice);
mDeviceList.setValue(mInternalDeviceList);
}

private ScanCallback scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
Log.d(TAG, "in callback");
BluetoothDevice mDevice = result.getDevice();
if (!mInternalDeviceList.contains(mDevice) && mDevice.getName() != null) {
injectIntoList(mDevice);
}
}

@Override
public void onScanFailed(int errorCode) {
Log.d(TAG, "onScanFailed: " + errorCode);
}
};

private ScanningStatus scanningStatus = new ScanningStatus() {
@Override
public void setCurrentlyScanning(boolean status) {
mIsScanning.setValue(status);
}

public boolean getCurrentlyScanning() {
return mIsScanning.getValue();
}
};

void doBtScan() {
Log.d(TAG, "flush list first");
flushList();
Log.d(TAG, "starting scan with scanCallback " + scanCallback);
scanningStatus.setCurrentlyScanning(true);
mBleScanner.startScan(scanCallback);
Log.d(TAG, "scan should be running for " + SCAN_PERIOD);

Handler handler = new Handler();
handler.postDelayed(() -> {
mBleScanner.stopScan(scanCallback);
scanningStatus.setCurrentlyScanning(false);
}, SCAN_PERIOD);
}
}
< /code>
Ich bin mir wirklich nicht sicher, was falsch ist. Liegt es daran, dass ich in meinem ViewModel neue BluetoothManager 
, BluetoothAdapter und BluetoothleScanner im Vergleich zur Hauptaktivität, bei der ich Berechtigungen initiiert und anfordern kann, in meinem ViewModel erstelle? Wenn ja, wie könnte ich die gleichen Objekte wiederverwenden?
Danke.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post