【发布时间】:2020-04-19 16:23:21
【问题描述】:
我正在构建一个 Android 应用程序,它可以宣传小包信息并使用 BLE 扫描信息。 广告代码为:
AdvertiseSettings advSettings = new AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
.setConnectable(false)
.build();
AdvertiseData advData = new AdvertiseData.Builder()
.setIncludeTxPowerLevel(true)
.addServiceUuid(uuid)
.build();
AdvertiseData advScanResponse = new AdvertiseData.Builder()
.setIncludeDeviceName(false)
.addServiceData(uuid,"1234567890".getBytes( Charset.forName( "UTF-8" ) ))
.build();
AdvertiseCallback advCallback = new AdvertiseCallback() {
String TAG="status";
@Override
public void onStartFailure(int errorCode) {
super.onStartFailure(errorCode);
Log.e(TAG, "Not broadcasting: " + errorCode);
int statusText;
switch (errorCode) {
case ADVERTISE_FAILED_ALREADY_STARTED:
Log.w(TAG, "ADVERTISE_FAILED_ALREADY_STARTED");
break;
case ADVERTISE_FAILED_DATA_TOO_LARGE:
Log.w(TAG, "ADVERTISE_FAILED_DATA_TOO_LARGE");
break;
case ADVERTISE_FAILED_FEATURE_UNSUPPORTED:
Log.w(TAG, "ADVERTISE_FAILED_FEATURE_UNSUPPORTED");
break;
case ADVERTISE_FAILED_INTERNAL_ERROR:
Log.w(TAG, "ADVERTISE_FAILED_INTERNAL_ERROR");
break;
case ADVERTISE_FAILED_TOO_MANY_ADVERTISERS:
Log.w(TAG, "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS");
break;
default:
Log.wtf(TAG, "Unhandled error: " + errorCode);
}
Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();
}
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
super.onStartSuccess(settingsInEffect);
Log.v(TAG, "Advertising started");
mText.setText(uuid.toString());
Toast.makeText(MainActivity.this, "Started", Toast.LENGTH_SHORT).show();
}
};
mBluetoothAdapter.getBluetoothLeAdvertiser()
.startAdvertising(advSettings, advData, advScanResponse, advCallback);
监听的代码如下:
mBluetoothLeScanner=mBluetoothAdapter.getBluetoothLeScanner();
ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
if( result == null
|| result.getDevice() == null
)
return;
if(result.getScanRecord().getServiceUuids()!=null) {
ParcelUuid pp=result.getScanRecord().getServiceUuids().get(0);
StringBuilder builder = new StringBuilder((pp.toString()+"\n"));
builder.append(new String (result.getScanRecord().getServiceUuids().size()+""));
mText.setText(builder.toString());
}
我已经在多部手机上进行了测试,效果很好。但是,除非打开位置,否则 Galaxy S8+ 上的 Android 9.0 版无法扫描。我还在 Redmi Note 7 上尝试了 Android 9.0 版本,它无需打开位置即可完美运行。是什么导致了我的问题?
【问题讨论】:
-
与 Pixel 手机相同。我想这是设计使然。否则,您可以向 Google 寻求答案。
标签: java android bluetooth-lowenergy