java - 背景上的 BLE 广告
问题描述
我正在开发联系人跟踪项目内部的 android 应用程序。我现在需要的是创建一个后台进程(idk if、服务、前台服务、工作人员等),即使应用程序关闭,它也可以保持 BLE 广告商发送信标。在主线程上工作没有问题,但是当我尝试在服务中转换时,它无法启动。这是我尝试过的服务类:
public class AdvertiserService extends Service {
private BluetoothLeAdvertiser advertiser;
private AdvertiseSettings settings;
private AdvertiseCallback callback;
@Override
public void onCreate() {
super.onCreate();
advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
settings = new AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
.setConnectable(false)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
.setTimeout(0)
.build();
callback = new AdvertiseCallback() {
@Override
public void onStartSuccess(AdvertiseSettings settingsInEffect) {
super.onStartSuccess(settingsInEffect);
}
@Override
public void onStartFailure(int errorCode) {
super.onStartFailure(errorCode);
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
long userId =
Long.parseLong(PreferenceManager.getDefaultSharedPreferences(this)
.getString(getString(R.string.user_id_pref_key), "0"));
MeetingBeacon beacon = new MeetingBeacon(userId, userId);
Log.d("MEETING_BACON", beacon.getBeaconUUID().toString() );
AdvertiseData data = new AdvertiseData.Builder()
.addServiceData(beacon.getBeaconUUID(), beacon.getBeaconData())
.build();
advertiser.startAdvertising(settings, data, callback);
return START_STICKY;
}
@Override
public void onDestroy(){
Log.d("ADVER-Sv","Automate service destroyed...");
advertiser.stopAdvertising(callback);
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public boolean stopService(Intent name) {
Log.d("SCAN-Sv","Automate service stop...");
advertiser.stopAdvertising(callback);
stopSelf();
return super.stopService(name);
}
}
我从主线程开始这项服务:
advertiserService = new Intent(this, AdvertiserService.class);
if(advertiserEnabled) {
ComponentName ret = startService(advertiserService);
if(ret != null){
Log.d("SERVICE:", sv.toString());
}
Log.d("SERVICE ", "fail");
}
但 ret 始终为 null ,因此服务无法启动。Idk 如果在这种情况下使用服务是更好的解决方案。任何人都可以建议哪个可能是解决此问题的更好解决方案?
解决方案
推荐阅读
- powershell - Powershell Forms - 用按钮暂停循环
- php - 存储过程不会从数据库中检索值并在 PHP 中显示输出
- ruby-on-rails - 示例帐户的种子
- oauth-2.0 - KeyCloak 中的自定义提供程序,可以根据用户名和密码进行身份验证
- c# - 如何在 xamarin 表单中更改设备语言
- vba - VBA 中的公式并在 VBA 中使用
- xamarin - xamarin.Android ViewRenderer 中的 AppCompatActivity
- android - Gradle Build 仅在测试中失败(Android Studio、Kotlin)
- rest - API 的初始化和存在端点
- javafx - 在 macOS 10.14 上运行时如何修复 TornadoFX 中的 NSInternalInconsistencyException?