Сканировать устройства Bluetooth, не работающие на Android Things DP3

Сканировать устройства Bluetooth, не работающие на Android Things DP3. Любая идея/обходной путь? Не выполняется действие BluetoothDevice.ACTION_FOUND.

Я добавил разрешения ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION из-за изменений в Android 6.0, но все еще не работает. https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html

Также android.permission.BLUETOOTH_ADMIN, android.permission.BLUETOOTH

Я проверил, ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION для Android >= 6.0 требует разрешения во время выполнения, но выдает ошибку из-за ограничений Android Things.

private void checkPermission() {

    List<String> permissionsList = new ArrayList<String>();
    List<String> permissionsNeeded = new ArrayList<String>();

    // app
    permissionsList.add(Manifest.permission.ACCESS_FINE_LOCATION);
    permissionsList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
    permissionsList.add(Manifest.permission.ACCESS_WIFI_STATE);
    permissionsList.add(Manifest.permission.SET_TIME_ZONE);
    // AndroidThingsLib
    permissionsList.add(Manifest.permission.BLUETOOTH_ADMIN);
    permissionsList.add(Manifest.permission.BLUETOOTH);
    permissionsList.add(Manifest.permission.CHANGE_WIFI_STATE);
    permissionsList.add(Manifest.permission.INTERNET);
    permissionsList.add(Manifest.permission.ACCESS_NETWORK_STATE);

    for (int i = 0; i < permissionsList.size(); i++){
        if (checkSelfPermission(permissionsList.get(i)) == PackageManager.PERMISSION_GRANTED) {
            permissionsNeeded.add(permissionsList.get(i));
            updateDataLogs(SourceEnum.System, "GRANTED: " + permissionsList.get(i));
        } else {
            permissionsNeeded.add(permissionsList.get(i));
            updateDataLogs(SourceEnum.Error, "NOT GRANTED: " + permissionsList.get(i));
        }
    }

    if (permissionsList.size()>0){
        requestPermissions(permissionsNeeded.toArray(new String[permissionsNeeded.size()]),5678);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 5678){
        for (int i = 0; i < permissions.length; i++){
            updateDataLogs(SourceEnum.Error, permissions[i] + " result " + grantResults[i]);
        }
    }
}
private void enableBluetoothScan() {
    updateDataLogs(SourceEnum.System, "enableBluetoothScan");

    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothDevice.ACTION_FOUND);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    registerReceiver(mReceiver, filter);

    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (bluetoothAdapter.isEnabled()){
        bluetoothAdapter.startDiscovery();
    } else {
        updateDataLogs(SourceEnum.Error, "Bluetooth Adapter not enabled");
    }
}

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            updateDataLogs(SourceEnum.System, "DISCOVERY STARTED");
        } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            updateDataLogs(SourceEnum.System, "DISCOVERY FINISHED");
        } else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (device.getBondState() != BluetoothDevice.BOND_BONDED)    {
                updateDataLogs(SourceEnum.System, "NEW DEVICE " + device.getName());
            }
        }
    }
};

person Mariano Rodriguez    schedule 23.04.2017    source источник


Ответы (2)


Как указано в обзоре платформы, предоставление разрешений во время выполнения не поддерживается на Android Things, поскольку на устройстве может не быть интерактивного дисплея для отображения диалогового окна. Вместо этого Android Things использует модель разрешений времени установки для всех разрешений, запрошенных в манифесте. Это означает, что вызовы таких методов, как requestPermissions(), не нужны и вам не помогут.

Что касается проблем, возникших во время текущей предварительной версии, следующая выдержка взята из примечаний к выпуску. :

Опасные разрешения, запрашиваемые приложениями, не предоставляются до следующей перезагрузки устройства. Сюда входят новые установки приложений и новые элементы в существующих приложениях.

В настоящее время, когда ваше приложение запрашивает опасные разрешения (например, разрешения на определение местоположения), вам необходимо перезагрузить устройство после установки (однократно), чтобы эти разрешения были предоставлены во время загрузки.

person devunwired    schedule 24.04.2017

Благодаря вашему объяснению того, что вы уже сделали, я смог победить эту проблему. Поскольку вы еще не отметили вопрос как решенный:

build.gradle (приложение; спасибо 1 и 2):

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    <!-- update this to your version of the Android SDK Tools -->
    buildToolsVersion "25.0.3"
    defaultConfig {
        minSdkVersion 24
    }
}

dependencies {
    <!-- update this to your version of Android Things -->
    provided 'com.google.android.things:androidthings:0.4-devpreview'
}

AndroidManifest.xml (спасибо 1 и 2):

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package=" . . . ">

    <!-- required for getState in startDiscovery -->
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <!-- required for startDiscovery -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <!-- required for the IntentFilter ACTION_FOUND -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <!-- change to your label -->
    <application android:label="Intel Edison">
        <uses-library android:name="com.google.android.things"/>

        <!-- change to the name of your Main Activity -->
        <activity android:name=".HomeActivity">
            <!-- Launch activity as default from Android Studio -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

            <!-- Launch activity automatically on boot -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.IOT_LAUNCHER"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

HomeActivity.java:

IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothDevice.ACTION_NAME_CHANGED);
registerReceiver(mReceiverBT, filter);

BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
boolean started = mBtAdapter.startDiscovery();
if (false == started) {
    <!-- in that case, catch BluetoothAdapter.STATE_ON in the receiver and start the Bluetooth Discovery then -->
    mBtAdapter.enable();
}

С помощью этого кода мое приложение запустилось сразу после загрузки платы Intel Edison и смогло обнаружить близлежащие устройства Bluetooth. Примечания:

  • На этой доске Android Things требуется 69 секунд (предварительная версия для разработчиков 4) или 82 секунды (предварительная версия для разработчиков 3) для запуска моего приложения.
  • В logcat я увидел «Не предоставление разрешения android.permission.ACCESS_COARSE_LOCATION для пакета… потому что он был ранее установлен без». Я не нашел способа обойти это; сообщается в проблеме 62514750.
  • На самом деле вам может вообще не понадобиться никакого «опасного» разрешения — например, я ничего не делаю с ACTION_FOUND — потому что ACTION_NANE_CHANGED всегда срабатывает здесь в моих сценариях; сообщается в проблеме 62524160.
person Alexander Traud    schedule 12.06.2017