Android 6.0 - Bluetooth - нет кода для трансляции Action_Found

ОБНОВИТЬ

Я пробовал много кодов, также из примеров, показанных в Интернете. каждый из них следует моему подходу. После многих часов тестирования я пришел к выводу, что в Android 6.0 нет возможности обнаружить Bluetooth неизвестных устройств, мы можем только извлечь связанные. Я уверен, что есть что-то с этой версией для Android.

если кто-то знает, как это исправить, я был бы очень признателен за любую помощь.

Оригинальный пост

Мой код работает нормально, но устройства не найдены. я получаю только DISCOVERY_STARTED и DISCOVERY_FINISHED, поэтому устройства не найдены, но с помощью системного приложения эти устройства обнаруживаются.

Это код моего приложения, надеюсь, это поможет.

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    bluetoothAdapter= BluetoothAdapter.getDefaultAdapter();

//other stuff...

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

    registerReceiver(myreceiver,filter);
}

final BroadcastReceiver myreceiver = new BroadcastReceiver(){

    @Override
    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();

        Log.i("test","RECEIVED: "+ action);
        if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
        }

        if(BluetoothDevice.ACTION_FOUND.equals(action))
        {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            Log.i("test", device.getName() + "\n" + device.getAddress());
        }
    }};

public void scanDevices(View v){

        if (bluetoothAdapter.isEnabled()){

            bluetoothAdapter.startDiscovery();
        }
}

Я уже получил права доступа:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 Edward Alexander04 июл. 2016 г., 19:53
Возможный дубликат этого вопросаВот
 Edward Alexander04 июл. 2016 г., 23:26
использованиеBuild.VERSION.SDK_INT, Проверь это
 Francesco Rizzi04 июл. 2016 г., 23:29
@ EdwardAlexander Спасибо за помощь, я проверю это. Как только я исправлю это, я отправлю ответ :)
 Francesco Rizzi04 июл. 2016 г., 23:22
@ EdwardAlexander Большое спасибо за это! Я проверю это! Тем не менее, я работаю с minsdk 9, как я могу использовать этот метод только на этом уровне API? Я не могу скомпилировать строку, которая использует эти новые методы.
 Edward Alexander04 июл. 2016 г., 23:07
Вы должны были четко указать, что вы используете зефир, это совсем другая история, здесь проверьте это:Зефир Bluetooth Discovery
 Francesco Rizzi04 июл. 2016 г., 19:55
@ EdwardAlexander Я так не думаю, я прочитал этот вопрос, и мой метод onReceive вызывается правильно. проблема в том, что я не получаю намерения ACTION_FOUND, просто DISCOVERY_STARTED и DISCOVERY_FINISHED. Устройства не найдены, но с помощью системного приложения я могу получить список доступных устройств. Зачем?

Ответы на вопрос(1)

Решение Вопроса

1. Добавьте разрешение FINE_LOCATION для манифеста:

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

2. Запросить разрешение FINE_LOCATION во время выполнения:

//since i was working with appcompat, i used ActivityCompat method, but this method can be called easily from Activity subclassess.
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSION_REQUEST_CONSTANT);

3. Реализуйте метод onRequestPermissionsResult:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {

switch (requestCode) {
    case MY_PERMISSION_REQUEST_CONSTANT: {
        // If request is cancelled, the result arrays are empty.
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

            //permission granted!
        }
        return;
    }
}
}

Все это потому, что Зефир требует это разрешение, чтобы использовать Bluetooth для обнаружения.

Поскольку это разрешение принадлежитопасно группа разрешений, просто объявив это в манифесте, не работает, нам нужно явное согласие пользователя на использование позиции (даже если мы на самом деле не нуждаемся в позиции).

 Alison01 июн. 2017 г., 11:44
Очень полезно, спасибо!

Ваш ответ на вопрос