屏幕关闭时蓝牙发现不起作用

时间:2019-04-17 10:30:57

标签: android service bluetooth

我在一个需要关闭屏幕的情况下进行一些蓝牙扫描的应用程序中。我使用前台服务来设置接收器,该前台服务使用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设备,所以没有用...

1 个答案:

答案 0 :(得分:0)

当Android进入打ze模式时,您可能正在挂起AlarmManager。 Android 6引入了Doze来关闭不动的手机,而Android 7引入了轻度的Doze模式,即使手机不是一动不动(例如放在口袋里),它也可以在屏幕关闭后几秒钟启动。

如果这是问题,最好的避免方法是停止使用AlarmManager进行定时处理。考虑使用具有postDelayed的Handler,该处理器不受Doze的影响。如果必须使用AlarmManager,请参阅here,以了解可能产生的迫使其触发的危险。例如,Android信标库甚至在打ze模式下也使用处理程序来循环扫描。

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