2

Я провел последние пару дней, пытаясь сделать приложение, которое позволяет моему Samsung Galaxy S3 mini (Android 2.1.4) обнаружить «бесконечное» количество времени. Мой код выглядит в настоящее время следующим образом:Android: установить Bluetooth Discoverability Unbounded

package com.example.downtoone; 

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v4.content.LocalBroadcastManager; 
import android.widget.Toast; 

import com.example.downtoone.*; 
import android.bluetooth.*; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 

public class MainActivity extends Activity { 

    private BluetoothAdapter mBluetoothAdapter = null; 

    // Intent request codes 
    private static final int REQUEST_CONNECT_DEVICE = 1; 
    private static final int REQUEST_ENABLE_BT = 2; 
    private static final int REQUEST_ENABLE_DSC = 3; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     if (mBluetoothAdapter == null) { 
      Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show(); 
      finish(); 
      return; 
     } 
    } 
    @Override 
    public void onStart() { 
     super.onStart(); 

     if (!mBluetoothAdapter.isEnabled()) { 
      Intent MDisc = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
      MDisc.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,0); 
      startActivityForResult(MDisc, REQUEST_ENABLE_DSC); 
     } 
    } 
    @Override 
    public void onRestart(){ 
     super.onRestart(); 
    } 
    @Override 
    public void onResume() { 
     super.onResume(); 
    } 
    @Override 
    public void onStop() { 
     super.onStop(); 
    } 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 
     case REQUEST_CONNECT_DEVICE: 
      if (resultCode == Activity.RESULT_OK) { 

      } 
      break; 
     case REQUEST_ENABLE_BT: 
      if (resultCode == Activity.RESULT_CANCELED) { 
       Toast.makeText(this, "BLUETOOTH NEEDS TO BE ENABLED AND DISCOVERABLE", Toast.LENGTH_SHORT).show(); 
       finish(); 
      } 
      break; 
     case REQUEST_ENABLE_DSC: 
      if (resultCode == Activity.RESULT_CANCELED) { 
       Toast.makeText(this, "BLUETOOTH NEEDS TO BE ENABLED AND DISCOVERABLE", Toast.LENGTH_SHORT).show(); 
       //finish(); 
      } 
      break; 
     } 
    } 

    public void finishBTsetup(){ 

    } 
} 

Несмотря на то, что я устанавливаю время «0», Discoverability работает только для 2minutes. Это довольно неприятно, так как я знаю, что устройство может справиться с возможностью обнаружения на неопределенное время! (Я мог вручную получить доступ к настройкам Bluetooth и установить Bluetooth-видимость на «Never Time Out»!)

Я искал ответы на все без ответа ... многие сообщения дают то, что (для относительного неквалифицированного программиста, такого как я) выглядят как тайные решения, которые слишком расплывчаты (*), запутывают (**) или совершенно неправильно. Было бы очень полезно получить простой ответ на этот вопрос (если он существует!)!

(*) Make Bluetooth on Android 2.1 discoverable indefinitely

(**) Extend Android Bluetooth Discoverability Android Application Bluetooth visibility duration (ответ раздел)

МАНИФЕСТ:

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.downtoone" 
     android:versionCode="1" 
     android:versionName="1.0" > 

     <uses-sdk 
      android:minSdkVersion="14" 
      android:targetSdkVersion="14" /> 
     <uses-permission android:name="android.permission.BLUETOOTH"/> 
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
     <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> 


     <application 
      android:allowBackup="true" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme" > 
      <activity 
       android:name=".MainActivity" 
       android:label="@string/app_name"> 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 

        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 
     </application> 

    </manifest> 

EDIT: Чтобы дать людям немного контекста, одна из целей этого приложения - попытаться быть ОТКРЫТОЙ для всех ближайших устройств Bluetooth, чтобы он мог напрямую разговаривать с ними. Поскольку большинство смартфонов можно обнаружить за короткий промежуток времени (обычно 2мин *), и только тогда, когда пользователь напрямую обеспечивает возможность обнаружения (= видимость), приложения, которые сканируют устройства и автоматически обмениваются данными, невозможно реализовать. (* Пользователь обычно может устанавливать видимость на «Нет времени», но для этого требуется, чтобы пользователь установил эту опцию непосредственно в настройках Bluetooth своего смартфона, что не очень изящное решение ...)

ответ

2

Я пришел к такому же выводу на трех устройствах, которые у меня есть.

  • ANDROID v 4.3 и выше: EXTRA_DISCOVERABLE_DURATION 0 работает без ограничений в
  • ANDROIND v 4.1: EXTRA_DISCOVERABLE_DURATION 0 составляет не более 1 час. Необходимо изменить вручную без ограничений в параметрах.
+0

Это больше подходит для commnet –

+3

Правда, но, похоже, мне не хватает репутации, чтобы комментировать :( –

+1

Кажется, что установка длительности в 0 больше не работает с android 7.0 ..? – JanBo

0

Согласно Документация для Android, максимальное время для обнаружения ограничено 300 секунд. Вы не можете заставить BT обнаружить навсегда.

Пожалуйста, см: http://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html#ACTION_REQUEST_DISCOVERABLE

Для того, чтобы получить 300second максимальный период, вам необходимо изменить одну строку кода, как:

MDisc.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300) 
+0

«По умолчанию устройство будет обнаруживаемым в течение 120 секунд. Вы можете определить различную продолжительность, добавив EXTRA_DISCOVERABLE_DURATION Намерение дополнительно. Максимальная продолжительность приложение может установить 3600 секунд, а значение 0 означает, что устройство всегда доступно для обнаружения ». (http://developer.android.com/guide/topics/connectivity/bluetooth.html#DiscoveringDevices) – MrRed

+0

^Цитата найдена в разделе «Включение возможности обнаружения» – MrRed

+0

Хорошо ... Еще одна несогласованность в документации ... Похоже, они добавили бесконечная продолжительность в Android 4.0. Измените файл манифеста и установите минимальную и целевую версию sdk на «14». Дайте мне знать, если он работает – Kasra

0

Я не уверен, если это подойдет приложение или если Есть еще одна причина, по которой вы не хотите этого делать, но почему бы просто не обнаружить время по умолчанию, а затем перезапустить обнаружение, когда оно истечет? таким образом, это технически будет неограниченное открытие, которое вызовет только ОЧЕНЬ небольшую паузу между ними, я использовал этот метод в своем приложении, используя широковещательный приемник.

Я положил startDiscovery() в метод onStart(), чтобы инициировать обнаружение при запуске активности, а затем прослушать ACTION_DISCOVERY_FINISHED в методе onReceive() вашего вещательного приемника, здесь добавьте еще один вызов startDiscovery().

это закроет открытие навсегда, если вы хотите остановиться, когда найдете устройство, а затем вызовите функцию cancelDiscovery() в слушателе ACTION_FOUND вашего приемника, вы также можете поместить здесь некоторую проверку, если вам нужно найти конкретное устройство - снова в в моем случае я проверял адрес MAC-адреса конкретного устройства, чтобы открытие продолжалось до тех пор, пока это не было найдено.

не уверен, что это какое-то использование, но если вам нужна дополнительная информация, дайте мне знать.

+1

Спасибо, но я не думаю ваше решение относится к моей проблеме. Вы говорите о том, чтобы поддерживать мое приложение в режиме обнаружения в течение бесконечного количества времени, а это значит, что он постоянно ищет устройства Discoverable. Но как эти устройства стали на первый взгляд открытыми? Ага! Ну, потому что их собственные BluetoothAdapters были установлены в режим Discoverable! Увидеть разницу? Режим обнаружения = поиск других устройств, которые доступны для обнаружения; Режим обнаружения: воспринимается другими устройствами, которые сканируют. Итак, все, о чем я забочусь, всегда находится в режиме обнаружения – MrRed

+0

ах, я неправильно понял, что вы спросили. – user3812950

0

Я пришел к выводу, что это невозможно, если только пользователь не перейдет в режим Bluetooth> Настройки> Тайм-аут видимости и не устанавливает таймаут соответственно.

Мир.

0

Работает для меня.

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
enableBtIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0); 
startActivityForResult(enableBtIntent, Utils.REQUEST_DEVICE_DISCOVERABLE); 

Отключить вручную Bluetooth и затем запустить код. Это будет работать, да.

+0

Ну, если вы посмотрите на метод onStart из моего кода, он будет выглядеть точно так же, как ваш код. Вы уверены, что он бежал бесконечно? ** Попробуйте поместить настройки Bluetooth в режим ожидания видимости 2min **. Затем выключите Bluetooth. Затем запустите свой код и посмотрите, есть ли Bluetooth для ** более ** 2 мин. Если он не работает, у вас есть та же проблема, что и у меня. – MrRed

+0

Я сделал два теста: во-первых, я включил BT и установил видимость тайм-аута до 2 мин. Через 2 минуты все прошло. Во-вторых, я запускаю свое приложение, а затем оно видно до сих пор, более 10 минут. Мой андроид - 4.4.4. Может быть, это может повлиять. –

+0

Спасибо за проверку, я подумал, что ваша версия для Android будет выше моей:/ – MrRed

1

над уровнем api 14 EXTRA_DISCOVERABLE_DURATION 0 работает с бесконечным пределом, но ниже этого он работает максимум 1 час.

Этот код работает для меня

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); 
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0); 
startActivityForResult(intent, Utils.REQUEST_DEVICE_DISCOVERABLE);