Java 类android.bluetooth.le.ScanRecord 实例源码
项目:eddystone-android
文件:Beacon.java
protected static Beacon beaconFromScanResult(ScanResult scanResult) {
ScanRecord scanRecord = scanResult.getScanRecord();
if (scanRecord == null) {
return null;
}
FrameType type;
Integer txPower;
double rssi = scanResult.getRssi();
byte[] bytes = scanRecord.getServiceData(EDDYSTONE_SPEC);
String identifier = scanResult.getDevice().getAddress();
txPower = txPowerFromBytes(bytes);
if (txPower != null) {
Beacon beacon = new Beacon(rssi, txPower, identifier);
beacon.parseScanResult(scanResult);
return beacon;
}
return null;
}
项目:proximity-manager
文件:BeaconRegisterActivity.java
private void processResult(ScanResult result) {
ScanRecord record = result.getScanRecord();
if (record == null || record.getServiceData(UID_SERVICE) == null) {
Log.w(TAG, "Invalid Eddystone scan result.");
return;
}
//Convert scan result into an AdvertisedId
Beacon.AdvertisedId advertisedId =
Beacon.AdvertisedId.fromAdvertisement(record.getServiceData(UID_SERVICE));
final Beacon discovered = new Beacon(advertisedId, Beacon.Status.STATUS_UNSPECIFIED);
//Scan callbacks are not on the main thread
runOnUiThread(new Runnable() {
@Override
public void run() {
//Notify the adapter, and get beacon resource from API
boolean added = mAdapter.addDiscoveredBeacon(discovered);
if (added) {
mProximityApi.getBeacon(discovered.advertisedId);
}
}
});
}
项目:sdc-1-quickstart-android
文件:MainActivity.java
/**
* Callback when a BLE advertisement has been found.
*
* @param callbackType Determines how this callback was triggered.
* @param result A Bluetooth LE scan result.
*/
@Override
public void onScanResult(int callbackType, final ScanResult result) {
super.onScanResult(callbackType, result);
// Get the ScanRecord and check if it is defined (is nullable)
final ScanRecord scanRecord = result.getScanRecord();
if (scanRecord != null) {
// Check if the Service UUIDs are defined (is nullable) and contain the discovery
// UUID
final List<ParcelUuid> serviceUuids = scanRecord.getServiceUuids();
if (serviceUuids != null && serviceUuids.contains(DISCOVERY_UUID)) {
// We have found our device, so update the GUI, stop scanning and start
// connecting
final BluetoothDevice device = result.getDevice();
// We'll make sure the GUI is updated on the UI thread
runOnUiThread(new Runnable() {
@Override
public void run() {
// At this point we have the device address and RSSI, so update those
deviceAddressTextView.setText(device.getAddress());
rssiTextView.setText(getString(R.string.rssi, result.getRssi()));
}
});
stopDiscovery();
bluetoothGatt = device.connectGatt(
MainActivity.this,
// False here, as we want to directly connect to the device
false,
bluetoothGattCallback
);
}
}
}
项目:AndroidMuseumBleManager
文件:ScanRecordCompat.java
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
ScanRecordCompat(ScanRecord record) {
mServiceUuids = record.getServiceUuids();
mManufacturerSpecificData = record.getManufacturerSpecificData();
mServiceData = record.getServiceData();
mDeviceName = record.getDeviceName();
mAdvertiseFlags = record.getAdvertiseFlags();
mTxPowerLevel = record.getTxPowerLevel();
mBytes = record.getBytes();
}
项目:FastBle
文件:BleManager.java
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public BleDevice convertBleDevice(ScanResult scanResult) {
if (scanResult == null) {
throw new IllegalArgumentException("scanResult can not be Null!");
}
BluetoothDevice bluetoothDevice = scanResult.getDevice();
int rssi = scanResult.getRssi();
ScanRecord scanRecord = scanResult.getScanRecord();
byte[] bytes = null;
if (scanRecord != null)
bytes = scanRecord.getBytes();
long timestampNanos = scanResult.getTimestampNanos();
return new BleDevice(bluetoothDevice, rssi, bytes, timestampNanos);
}
项目:Android-BLE-Library
文件:BLEScanner.java
private void initScanData() {
scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
Log.i(TAG, "onScanResult" + result);
String address = result.getDevice().getAddress();
String name;
ScanRecord scanRecord = result.getScanRecord();
name = scanRecord == null ? "unknown" : scanRecord.getDeviceName();
scanResultListener.onResultReceived(name, address);
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
Log.e(TAG, "onBatchScanResults");
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
Log.e(TAG, "onScanFailed");
scanResultListener.onScanFailed(errorCode);
}
};
filters = new ArrayList<>();
filters.add(new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString(BLEProfile.UUID_SERVICE)).build());
scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
}
项目:livingCity-Android
文件:TemperatureBeacon.java
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TemperatureBeacon(ScanRecord record, String deviceAddress, int rssi) {
mSignal = rssi;
mAddress = deviceAddress;
mName = record.getDeviceName();
byte[] data = record.getServiceData(THERM_SERVICE);
if (data != null) {
mCurrentTemp = parseTemp(data);
} else {
mCurrentTemp = 0f;
}
}
项目:AndroidBleManager
文件:ScanRecordCompat.java
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
ScanRecordCompat(ScanRecord record) {
mServiceUuids = record.getServiceUuids();
mManufacturerSpecificData = record.getManufacturerSpecificData();
mServiceData = record.getServiceData();
mDeviceName = record.getDeviceName();
mAdvertiseFlags = record.getAdvertiseFlags();
mTxPowerLevel = record.getTxPowerLevel();
mBytes = record.getBytes();
}
项目:BluetoothCompat
文件:ScanRecordCompat.java
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
ScanRecordCompat(ScanRecord record) {
mServiceUuids = record.getServiceUuids();
mManufacturerSpecificData = record.getManufacturerSpecificData();
mServiceData = record.getServiceData();
mDeviceName = record.getDeviceName();
mAdvertiseFlags = record.getAdvertiseFlags();
mTxPowerLevel = record.getTxPowerLevel();
mBytes = record.getBytes();
}
项目:android-buruberi
文件:Testing.java
public static ScanRecord parseScanRecordFromBytes(byte[] bytes) {
try {
Method parseFromBytes = ScanRecord.class.getMethod("parseFromBytes", byte[].class);
return (ScanRecord) parseFromBytes.invoke(null, (Object) bytes);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
项目:nearby-beacons
文件:EddystoneScannerService.java
private void processResult(ScanResult result) {
ScanRecord record = result.getScanRecord();
if (record == null) {
Log.w(TAG, "Invalid scan record.");
return;
}
final byte[] data = record.getServiceData(UID_SERVICE);
if (data == null) {
Log.w(TAG, "Invalid Eddystone scan result.");
return;
}
final String deviceAddress = result.getDevice().getAddress();
final int rssi = result.getRssi();
byte frameType = data[0];
switch (frameType) {
case TYPE_UID:
mCallbackHandler.post(new Runnable() {
@Override
public void run() {
processUidPacket(deviceAddress, rssi, data);
}
});
break;
case TYPE_TLM:
case TYPE_URL:
//Do nothing, ignoring these
return;
default:
Log.w(TAG, "Invalid Eddystone scan result.");
}
}
项目:BlueSTSDK_Android
文件:ScanCallbackBridge.java
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
ScanRecord record = result.getScanRecord();
if(record!=null)
mCallbackPre21.onLeScan(result.getDevice(),result.getRssi(),record.getBytes());
}
项目:divertsy-client
文件:BLEScanner.java
public BLEScanner(final Activity activity, int requestEnableBluetooth, @NonNull OnClosestChangedListener onClosestChangedListener) {
mRequestEnableBluetooth = requestEnableBluetooth;
mOnClosestChangedListener = onClosestChangedListener;
init(activity);
scanFilters = new ArrayList<>();
scanFilters.add(new ScanFilter.Builder().setServiceUuid(EDDYSTONE_SERVICE_UUID).build());
scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
ScanRecord scanRecord = result.getScanRecord();
if (scanRecord == null) {
return;
}
String deviceAddress = result.getDevice().getAddress();
Beacon beacon;
if (!deviceToBeaconMap.containsKey(deviceAddress)) {
beacon = new Beacon(deviceAddress, result.getRssi());
deviceToBeaconMap.put(deviceAddress, beacon);
} else {
deviceToBeaconMap.get(deviceAddress).lastSeenTimestamp = System.currentTimeMillis();
deviceToBeaconMap.get(deviceAddress).rssi = result.getRssi();
}
byte[] serviceData = scanRecord.getServiceData(EDDYSTONE_SERVICE_UUID);
validateServiceData(deviceAddress, serviceData);
findClosest();
}
@Override
public void onScanFailed(int errorCode) {
switch (errorCode) {
case SCAN_FAILED_ALREADY_STARTED:
logErrorAndShowToast(activity, "SCAN_FAILED_ALREADY_STARTED");
break;
case SCAN_FAILED_APPLICATION_REGISTRATION_FAILED:
logErrorAndShowToast(activity, "SCAN_FAILED_APPLICATION_REGISTRATION_FAILED");
break;
case SCAN_FAILED_FEATURE_UNSUPPORTED:
logErrorAndShowToast(activity, "SCAN_FAILED_FEATURE_UNSUPPORTED");
break;
case SCAN_FAILED_INTERNAL_ERROR:
logErrorAndShowToast(activity, "SCAN_FAILED_INTERNAL_ERROR");
break;
default:
logErrorAndShowToast(activity, "Scan failed, unknown error code");
break;
}
}
};
}
项目:BLECommunication
文件:BLEUtil.java
public void scanPeripheralWithServicesUUID_API21(final String uuid) {
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
requestOpenBT();
return;
}
BluetoothLeScanner scanner = mBluetoothAdapter.getBluetoothLeScanner();
ScanSettings settings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
List<ScanFilter> list = new ArrayList<ScanFilter>(1);
ScanCallback callback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, android.bluetooth.le.ScanResult result) {
BluetoothDevice device = result.getDevice();
ScanRecord sr = result.getScanRecord();
int rssi = result.getRssi();
// if (rssi > -15) {
// runCallbackWithErrorCode(BLEUtilErrorCode.E_RSSI_ERROR);
// return;
// }
// if (rssi < -35) {
// runCallbackWithErrorCode(BLEUtilErrorCode.E_RSSI_TOO_LOW);
// return;
// }
if (matchRules(rssi, sr.getBytes(), uuid)) {
connectToDevice(device);
}
}
@Override
public void onScanFailed(int errorCode) {
}
};
if (uuid != null) {
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString(uuid)).build();
list.add(filter);
scanner.startScan(list, settings, callback);
} else {
// scanner.startScan(null, settings, callback);
scanner.startScan(callback);
}
}
项目:BLECommunication
文件:BLEUtil.java
public void scanPeripheralWithServicesUUID_API21(final String uuid) {
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
requestOpenBT();
return;
}
BluetoothLeScanner scanner = mBluetoothAdapter.getBluetoothLeScanner();
ScanSettings settings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
List<ScanFilter> list = new ArrayList<ScanFilter>(1);
ScanCallback callback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, android.bluetooth.le.ScanResult result) {
BluetoothDevice device = result.getDevice();
ScanRecord sr = result.getScanRecord();
int rssi = result.getRssi();
// if (rssi > -15) {
// runCallbackWithErrorCode(BLEUtilErrorCode.E_RSSI_ERROR);
// return;
// }
// if (rssi < -35) {
// runCallbackWithErrorCode(BLEUtilErrorCode.E_RSSI_TOO_LOW);
// return;
// }
if (matchRules(rssi, sr.getBytes(), uuid)) {
connectToDevice(device);
}
}
@Override
public void onScanFailed(int errorCode) {
}
};
if (uuid != null) {
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString(uuid)).build();
list.add(filter);
scanner.startScan(list, settings, callback);
} else {
// scanner.startScan(null, settings, callback);
scanner.startScan(callback);
}
}
项目:AndroidBluttoothMasterAndSlave
文件:BLEScanner.java
private void initScanData() {
scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
Log.d(TAG, "["+
Thread.currentThread().getStackTrace()[2].getFileName() + "_" +
Thread.currentThread().getStackTrace()[2].getLineNumber() + "_" +
Thread.currentThread().getStackTrace()[2].getMethodName() + "]");
Log.i(TAG, "result" + result);
String address = result.getDevice().getAddress();
String name;
ScanRecord scanRecord = result.getScanRecord();
int mRssi = result == null ? -127: result.getRssi();
Log.i(TAG, "Rssi: " +mRssi);
name = scanRecord == null ? "unknown" : scanRecord.getDeviceName();
//TODO stop scan
// if (name != null)
// {
// Log.d(TAG, "["+
// Thread.currentThread().getStackTrace()[2].getFileName() + "_" +
// Thread.currentThread().getStackTrace()[2].getLineNumber() + "_" +
// Thread.currentThread().getStackTrace()[2].getMethodName() + "]" + "========StopScan");
// stopScan();
// }
scanResultListener.onResultReceived(name, address, mRssi);
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
Log.d(TAG, "["+
Thread.currentThread().getStackTrace()[2].getFileName() + "_" +
Thread.currentThread().getStackTrace()[2].getLineNumber() + "_" +
Thread.currentThread().getStackTrace()[2].getMethodName() + "]");
Log.e(TAG, "onBatchScanResults");
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
Log.d(TAG, "["+
Thread.currentThread().getStackTrace()[2].getFileName() + "_" +
Thread.currentThread().getStackTrace()[2].getLineNumber() + "_" +
Thread.currentThread().getStackTrace()[2].getMethodName() + "]");
Log.e(TAG, "onScanFailed");
scanResultListener.onScanFailed(errorCode);
}
};
filters = new ArrayList<>();
filters.add(new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString(BLEProfile.UUID_SERVICE)).build());
scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();
}
项目:wearbooksource
文件:BleScanScanActivity.java
private void handleScanResult ( ScanResult scanResult) {
BluetoothDevice aBluetoothDevice = scanResult.getDevice() ;
Log.d (TAG, "handleScanResult aBluetoothDevice =" + aBluetoothDevice.toString()) ;
foundBluetoothDevices.put(aBluetoothDevice.getAddress(), aBluetoothDevice) ;
refreshView(foundBluetoothDevices);
aBluetoothDevice.getName() ;
aBluetoothDevice.getAddress() ;
aBluetoothDevice.getBluetoothClass() ;
ScanRecord aScanRecord = scanResult.getScanRecord() ;
int signalStrengthDbm = scanResult.getRssi() ;
// signal strength in dBm.
//dBmW or Decibel-milliwatts), power ratio in decibels (dB) of the measured power
// referenced to one milliwatt (mW)
scanResult.getTimestampNanos() ;
}
项目:eddystone-android
文件:Beacon.java
protected void parseScanResult(ScanResult scanResult) {
ScanRecord scanRecord = scanResult.getScanRecord();
if (scanRecord == null) {
return;
}
double rssi = scanResult.getRssi();
byte[] bytes = scanRecord.getServiceData(EDDYSTONE_SPEC);
updateRssi(rssi);
FrameType type = frameTypeFromBytes(bytes);
if (type != null) {
switch (type) {
case URL:
UrlFrame urlFrame = UrlFrame.frameWithBytes(bytes);
if (urlFrame != null) {
mFrames[0] = urlFrame;
Global.log("Parsed URL Frame with mUrl: " + urlFrame.mUrl);
notifyChange();
}
break;
case UID:
UidFrame uidFrame = UidFrame.frameWithBytes(bytes);
if (uidFrame != null) {
mFrames[1] = uidFrame;
Global.log("Parsed UID Frame with uid: " + uidFrame.getUid());
notifyChange();
}
break;
case TLM:
TlmFrame tlmFrame = TlmFrame.frameWithBytes(bytes);
if (tlmFrame != null) {
mFrames[2] = tlmFrame;
Global.log("Parsed TLM Frame with battery: " + tlmFrame.mBatteryVolts + " temperature: " + tlmFrame.mTemperature + " advertisement count: " + tlmFrame.mAdvertisementCount
+ " on time: " + tlmFrame.mOnTime);
notifyChange();
}
break;
default:
break;
}
}
}
项目:android-beacon-library
文件:ScanJob.java
@Override
public boolean onStartJob(final JobParameters jobParameters) {
initialzeScanHelper();
if (jobParameters.getJobId() == IMMEDIATE_SCAN_JOB_ID) {
LogManager.i(TAG, "Running immediate scan job: instance is "+this);
}
else {
LogManager.i(TAG, "Running periodic scan job: instance is "+this);
}
List<ScanResult> queuedScanResults = ScanJobScheduler.getInstance().dumpBackgroundScanResultQueue();
LogManager.d(TAG, "Processing %d queued scan resuilts", queuedScanResults.size());
for (ScanResult result : queuedScanResults) {
ScanRecord scanRecord = result.getScanRecord();
if (scanRecord != null) {
mScanHelper.processScanResult(result.getDevice(), result.getRssi(), scanRecord.getBytes());
}
}
LogManager.d(TAG, "Done processing queued scan resuilts");
boolean startedScan;
if (mInitialized) {
LogManager.d(TAG, "Scanning already started. Resetting for current parameters");
startedScan = restartScanning();
}
else {
startedScan = startScanning();
}
mStopHandler.removeCallbacksAndMessages(null);
if (startedScan) {
LogManager.i(TAG, "Scan job running for "+mScanState.getScanJobRuntimeMillis()+" millis");
mStopHandler.postDelayed(new Runnable() {
@Override
public void run() {
LogManager.i(TAG, "Scan job runtime expired: " + ScanJob.this);
stopScanning();
mScanState.save();
ScanJob.this.jobFinished(jobParameters , false);
// need to execute this after the current block or Android stops this job prematurely
mStopHandler.post(new Runnable() {
@Override
public void run() {
scheduleNextScan();
}
});
}
}, mScanState.getScanJobRuntimeMillis());
}
else {
LogManager.i(TAG, "Scanning not started so Scan job is complete.");
ScanJob.this.jobFinished(jobParameters , false);
}
return true;
}
项目:mobly-bundled-snippets
文件:JsonSerializer.java
/**
* Serialize ScanRecord for Bluetooth LE.
*
* <p>Not all fields are serialized here. Will add more as we need.
*
* <pre>The returned {@link Bundle} has the following info:
* "DeviceName", String
* "TxPowerLevel", String
* </pre>
*
* @param record A {@link ScanRecord} object.
* @return A {@link Bundle} object.
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private Bundle serializeBleScanRecord(ScanRecord record) {
Bundle result = new Bundle();
result.putString("DeviceName", record.getDeviceName());
result.putInt("TxPowerLevel", record.getTxPowerLevel());
return result;
}