Android蓝牙扫描仪未运行即服务

时间:2017-03-23 10:58:48

标签: java android service bluetooth-lowenergy ibeacon

我正在尝试将蓝牙信标扫描器作为服务运行,因此当应用程序未处于活动状态时,如果检测到信标,则会发出通知。

服务代码(Java):

public class BtService extends Service {
    public static final String  TAG = BtService.class.getSimpleName();
    private ScanCallback mScanCallback;
    private BluetoothAdapter btAdapter;
    private BluetoothLeScanner btScanner;
    private boolean             mIsScanning             = false;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "OnCreate Service");

        final BluetoothManager btManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
        btAdapter = btManager.getAdapter();

        initBtCallBack();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "OnStartCommand Service");
        btStartScanning();

        return Service.START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        Log.d(TAG, "Destroy");
        btStopScanning();
    }

    /**
     * BlueTooth CallBack
     */
    private void initBtCallBack() {
        Log.d(TAG, "InitBtCallBack");
        try {
            btScanner = btAdapter.getBluetoothLeScanner();
        } catch (Exception e) {
            e.printStackTrace();
        }

        mScanCallback = new ScanCallback() {
            @Override
            public void onScanResult(int callbackType, ScanResult result) {
                Log.i(TAG, "Something found : " + result.getDevice().getAddress());
                BluetoothDevice device = result.getDevice();
                Log.i(TAG, "btDevice : " + device.toString());
                Log.i(TAG, "result : " + result.toString());
                btUseBeacon(result);
            }

        };
    }

    private void btStartScanning() {
        if (btScanner != null) {
            if(! mIsScanning) {
                Log.i(TAG, "START scanning...");

                myBeacons.clear();

                loadMyBeaconList();

                mIsScanning = true;
                btScanner.startScan(mScanCallback);
            }
        } else {
            Log.i(TAG, "CANNOT START Scanning");
        }
    }

    private void btStopScanning() {
        if(mIsScanning) {
            Log.i(TAG, "STOP scanning");
            mIsScanning = false;
            btScanner.stopScan(mScanCallback);

            saveMyBeaconList();
        }
    }
}

还有一个BroadcastReceiver类来启动服务

public class BtStartServiceReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service = new Intent(context, BtService.class);
        context.startService(service);
    }
}

在Manifest.xml中的Déclaration之间。 Boot_Completed的权限也已添加。

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<service
    android:name=".BtService"
    android:icon="@mipmap/ic_launcher"
    android:enabled="true">
</service>

<receiver android:name=".BtStartServiceReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

当应用程序处于活动状态时,它似乎不起作用。在logcat中,我没有在服务代码中看到任何添加的LOG。

当我终止应用程序时,logcat显示应用程序正在重新启动,但没有任何关于Logs in code。

当我尝试运行适用于某个活动的代码时,它可以正常工作,检测到信标并可以发出通知。

我不会使用任何信标库或SDK,因为我使用通用信标。

感谢您的帮助。

0 个答案:

没有答案