首页 > 解决方案 > 背景上的 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 如果在这种情况下使用服务是更好的解决方案。任何人都可以建议哪个可能是解决此问题的更好解决方案?

标签: javaandroidbluetooth-lowenergybackground-processcontact-tracing-api

解决方案


推荐阅读