Как программно установить время обнаружения без подтверждения пользователя? - PullRequest
7 голосов
/ 05 января 2012

Я обычно использую это

private void ensureDiscoverable() {
    if(D) Log.d(TAG, "ensure discoverable");
    if (mBluetoothAdapter.getScanMode() !=
            BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
        Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
        startActivity(discoverableIntent);
    }
}

Но это требует подтверждения пользователя. Есть ли способ обойти это программно?

Кроме того, я полагаю, что нет никаких «новостей» в «всегда обнаруживаемом режиме »?

Ответы [ 3 ]

6 голосов
/ 11 января 2012

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

private void ensureBluetoothDiscoverability() {
    try {
        IBluetooth mBtService = getIBluetooth();
        Log.d("TESTE", "Ensuring bluetoot is discoverable");
        if(mBtService.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
            Log.e("TESTE", "Device was not in discoverable mode");
            try {
                mBtService.setDiscoverableTimeout(100);
                // mBtService.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, 1000);
            } catch(Exception e) {
                Log.e("TESTE", "Error setting bt discoverable",e);
            }
            Log.i("TESTE", "Device must be discoverable");
        } else {
            Log.e("TESTE", "Device already discoverable");
        }
    } catch(Exception e) {
        Log.e("TESTE", "Error ensuring BT discoverability", e);
    }    
}


<uses-permission android:name="android.permission.WRITE_SETTINGS" />  
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

А затем создайте новый пакет android.bluetooth, поместите два файла в IBluetooth.aidl и IBluetoothCallback.aidl и вставьте код, как показано здесь .

Это позволит получить доступ к функциям, которые недоступны в стандартном API, но для некоторых из них вам потребуется разрешение на «запись безопасных настроек» (строка комментария выше, где вы получите это исключение из-за отсутствия разрешений для процесс / пользователь).

2 голосов
/ 24 мая 2015

Это то, что я сделал, и это прекрасно работает для меня:

Метод:

public void makeDiscoverable (int timeOut){
    Class <?> baClass = BluetoothAdapter.class;
    Method [] methods = baClass.getDeclaredMethods();
    Method mSetScanMode = methods[44];
    try {
        mSetScanMode.invoke(Util.mBluetoothAdapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeOut);
    } catch (Exception e) {
        Log.e("discoverable", e.getMessage());
    }       
}

Добавить разрешение:

<uses-permission android:name="android.permission.WRITE_SETTINGS" />  
1 голос
/ 05 января 2012

Ничего. Требуется подтверждение пользователя.

Быть всегда обнаруживаемым - это разряжать батарею, поэтому простого решения не существует Также это проблема конфиденциальности. Лучше спросить пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...