Android App 蓝牙扫描功能页面, SCAN 按键触发蓝牙扫描
XML 文件:
app\res\layout\activity_configuration.xml
JAVA 文件:
app\java\no.nordicsemi.android.nrfthingy\configuration\InitialConfigurationActivity.java
app\java\no.nordicsemi.android.nrfthingy\common\ScannerFragment.java
app\thingylib\java\no.nordicsemi.android.thingylib\utils\ThingyUtils.java (service UUID 定义)
==================================
启动函数
mConfirmThingy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (Utils.checkIfVersionIsMarshmallowOrAbove()) {
if (ActivityCompat.checkSelfPermission(InitialConfigurationActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
if(isLocationEnabled()) {
if (isBleEnabled()) {
final String title = mConfirmThingy.getText().toString().trim();
if (title.contains("Disconnect")) {
mAddressNfc = null;
mThingySdkManager.disconnectFromThingy(mDevice);
mConfirmThingy.setText(R.string.scan_thingy);
}
mScannerFragment.show(getSupportFragmentManager(), null);
} else enableBle();
} else {
Utils.showToast(InitialConfigurationActivity.this, getString(R.string.location_services_disabled));
}
} else {
final PermissionRationaleDialogFragment dialog = PermissionRationaleDialogFragment.getInstance(Manifest.permission.ACCESS_COARSE_LOCATION, Utils.REQUEST_ACCESS_COARSE_LOCATION, getString(R.string.rationale_message_location));
dialog.show(getSupportFragmentManager(), null);
}
} else {
if (isBleEnabled()) {
final String title = mConfirmThingy.getText().toString().trim();
if (title.contains("Disconnect")) {
mAddressNfc = null;
mThingySdkManager.disconnectFromThingy(mDevice);
}
mScannerFragment.show(getSupportFragmentManager(), null);
} else enableBle();
}
}
});
扫描函数
/**
* Scan for 5 seconds and then stop scanning when a BluetoothLE device is found
* then mLEScanCallback is activated
* This will perform regular scan for custom BLE Service UUID
* and then filter out using class ScannerServiceParser
*/
private void startScan() {
// Since Android 6.0 we need to obtain either Manifest.permission.ACCESS_COARSE_LOCATION or Manifest.permission.ACCESS_FINE_LOCATION to be able to scan for
// Bluetooth LE devices. This is related to beacons as proximity devices.
// On API older than Marshmallow the following code does nothing.
if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// When user pressed Deny and still wants to use this functionality, show the rationale
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION)) {
return;
}
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_REQ_CODE);
return;
}
mAdapter.clearDevices();
mScanButton.setText(R.string.scanner_action_cancel);
troubleshootView.setVisibility(View.VISIBLE);
final BluetoothLeScannerCompat scanner = BluetoothLeScannerCompat.getScanner();
final ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).setReportDelay(750).setUseHardwareBatchingIfSupported(false).setUseHardwareFilteringIfSupported(false).build();
final List<ScanFilter> filters = new ArrayList<>();
filters.add(new ScanFilter.Builder().setServiceUuid(mUuid).build());
scanner.startScan(filters, settings, scanCallback);
mIsScanning = true;
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (mIsScanning) {
stopScan();
}
}
}, SCAN_DURATION);
}
==================================
重要说明
蓝牙扫描时, 过滤规划限制为以下语句中的 mUuid; 如蓝牙设备基本协议服务 UUID 不同,则无法识别;
filters.add(new ScanFilter.Builder().setServiceUuid(mUuid).build());
==================================
mUuid 变量追溯
private ParcelUuid mUuid;
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Bundle args = getArguments();
mUuid = args.getParcelable(PARAM_UUID);
// mUuid = ParcelUuid.fromString("EF680100-9B35-4933-9B10-52FFA9740042");
}
--------------------------------------------------------------------------------------
private final static String PARAM_UUID = "param_uuid";
public static ScannerFragment getInstance(final UUID uuid) {
final ScannerFragment fragment = new ScannerFragment();
final Bundle args = new Bundle();
if (uuid != null) {
args.putParcelable(PARAM_UUID, new ParcelUuid(uuid));
}
fragment.setArguments(args);
return fragment;
}
--------------------------------------------------------------------------------------
private ScannerFragment mScannerFragment;
mScannerFragment = ScannerFragment.getInstance(ThingyUtils.THINGY_BASE_UUID);
mScannerFragment.show(getSupportFragmentManager(), null);
--------------------------------------------------------------------------------------
public static final UUID THINGY_BASE_UUID = new UUID(0xEF6801009B354933L, 0x9B1052FFA9740042L);