屏幕关闭时蓝牙发现无法正常工作

问题描述 投票:0回答:1

我正在一个应用程序中工作,我们需要在屏幕关闭时进行一些蓝牙扫描。我使用一个使用AlarmManager类每分钟运行的前台服务来设置接收器。问题是,使用我的Oneplus 6(Android版本9.0),它不会在屏幕关闭的情况下运行,但是当屏幕打开时,一切都运行得很好。

你知道它是否与Android版本有关吗?

如果您需要更多部分代码,请告诉我。

谢谢!

这是我注册接收器的地方


public void registerReceivers(Context context) {

            IntentFilter intentFilter = new IntentFilter();

            intentFilter.addAction(BluetoothDevice.ACTION_FOUND);                         

            intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

            context.registerReceiver(btReceiver,intentFilter);                      

}


然后,这是我在注册接收器后开始发现的方式


public void startScan(Context context){

    registerReceivers(context)

    btReceiver.startScan(context);

}


其中btReceiver是以下对象


public class BtReceiver extends BroadcastReceiver {

    

    //BtConn is an object that store some information about the founded device

    public final List<BtConn> btConns;

    public  BluetoothAdapter bluetoothAdapter;


    public BtReceiver() {

        super(ScanType.BLUETOOTH);

        this.btConns = new ArrayList<>();

        this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

    }


    @Override

    public void onReceive(Context context, Intent intent) {

        String action =intent.getAction();

        //Case when a device has been found

        if (BluetoothDevice.ACTION_FOUND.equals(action)) {

            //Getting device values

            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

            String deviceName = device.getName();

            String macAddress = device.getAddress();

            int rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE);

            //Checking if it is a Phone by default is True

            boolean isMobile = true;

            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {

                isMobile = BluetoothDevice.DEVICE_TYPE_CLASSIC == device.getType();;

            }

            //adding object to list

            if(deviceName != null && deviceName.length() > 0) { btConns.add(new BtConn(deviceName,rssi, macAddress,isMobile)); }

            return;

        }


        if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { scanFinished(context);return; }


    }


    public void startScan(Context context) {

        this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        bluetoothAdapter.startDiscovery();

    }


    public void scanFinished(context) {

        //Here there is some stuff to upload the information to the database

    }


}


然后在我的服务的onStartCommand中运行:



public int onStartCommand(Intent intent, int flags, int startId) {

    startForeground(ID_NOTIFICATION, myCustomNotification()));    

    startScan(this);

    return START_STICKY;

}    

[编辑]

我试过,使用处理程序而不是AlarmManager,但它具有相同的行为。当屏幕关闭时,一旦我调用startDiscovery方法,它似乎不起作用。而且,我没有使用我用BLE扫描测试的发现方法。这种扫描在屏幕熄灭时有效,但我想找到其他Android设备,所以没用......

android service bluetooth
1个回答
0
投票

当Android进入打盹模式时,您可能会遇到暂停AlarmManager的情况。 Android 6推出了Doze用于屏幕关闭静态手机,Android 7推出了一种轻度打盹模式,即使手机没有静止(例如在你的口袋里),屏幕关闭后几秒钟也会启动。

如果这是问题,避免它的最佳方法是停止使用AlarmManager进行定时处理。考虑使用带有postDelayed的Handler,它不受Doze的影响。如果必须使用AlarmManager,请参阅here以获取可能的阻止它们发射的kludges。例如,Android Beacon Library使用处理程序即使在打盹模式下也可以循环扫描。

OnePlus还具有一些专有的电池节电功能,这些功能最终会在延长应用运行时间后终止您的前台服务。但听起来这不是你面临的问题..

© www.soinside.com 2019 - 2024. All rights reserved.