scanner - Android: establece la capacidad de detección de Bluetooth ilimitada
recibir datos bluetooth android (6)
De acuerdo con la documentación de Android, el tiempo máximo para ser detectable tiene un tope de 300 segundos. No puedes hacer que el BT sea visible para siempre.
Para obtener el período máximo de 300 segundos, debe cambiar una línea de código como:
MDisc.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,300)
He pasado los últimos días intentando hacer una aplicación que mantenga mi Samsung Galaxy S3 mini (Android 2.1.4) reconocible durante un tiempo "infinito". Mi código se ve actualmente de la siguiente manera:
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(){
}
}
A pesar de que estoy ajustando el tiempo a ''0'', la visibilidad solo se ejecuta durante 2 minutos. Esto es bastante frustrante, ya que sé que el dispositivo puede manejar para ser detectable por un tiempo indefinido. (Pude acceder manualmente a la configuración de bluetooth y establecer la visibilidad de Bluetooth en ''Never Time Out''!)
He buscado por todas partes una respuesta sin éxito ... muchas publicaciones dan lo que (para un programador relativamente inexperto como yo) se parecen a soluciones arcanas que son demasiado vagas (*), confusas (**) o francamente incorrectas. ¡Una respuesta simple y simple para resolver este problema (si existe, por supuesto!) Sería muy apreciada.
(*) Haga que Bluetooth en Android 2.1 se pueda ver indefinidamente
(**) Amplíe Android Bluetooth Discoverability Aplicación de Android Duración de la visibilidad de Bluetooth (sección de respuestas)
MANIFIESTO:
<?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>
EDITAR: para darles a las personas un pequeño contexto, uno de los objetivos de esta aplicación es intentar y DESCUBRIR a todos los dispositivos Bluetooth cercanos para que pueda hablar directamente con ellos. Dado que la mayoría de los teléfonos inteligentes son detectables por períodos cortos de tiempo (2 minutos por lo general *) y solo cuando el usuario habilita directamente la visibilidad (= visibilidad), las aplicaciones que buscan dispositivos e intercambian datos automáticamente son imposibles de implementar. (* El usuario generalmente puede configurar la visibilidad a ''No Time Out'', pero eso requiere que el usuario configure esa opción directamente en Configuración de Bluetooth de su teléfono inteligente, que no es una solución muy elegante ...)
No estoy seguro de si esto sería adecuado para su aplicación o si hay alguna otra razón por la que no desea hacer esto, pero ¿por qué no solo descubrir el tiempo predeterminado y luego reiniciar el descubrimiento cuando se agota el tiempo? de esta manera, técnicamente será un descubrimiento ilimitado, que solo disparará una pausa muy leve en el medio, utilicé este método en mi aplicación utilizando un receptor de difusión.
Puse startDiscovery () en el método onStart () para desencadenar el descubrimiento en el inicio de actividad, luego escucho ACTION_DISCOVERY_FINISHED en el método onReceive () de su receptor de difusión, aquí realice otra llamada a startDiscovery ().
esto recorrerá el descubrimiento para siempre, si desea detenerse cuando encuentre un dispositivo, luego llame a cancelDiscovery () en el oyente ACTION_FOUND de su receptor, también puede hacer algunas comprobaciones aquí si necesita encontrar un dispositivo en particular, nuevamente en mi caso yo estaba verificando la dirección MAC de un dispositivo en particular para que el descubrimiento continúe hasta que se encuentre.
No estoy seguro si esto es de alguna utilidad, pero si necesita más detalles háganmelo saber.
Llegué a la conclusión de que no se puede hacer, a menos que el usuario vaya a Bluetooth> Configuración> Visibilidad y establezca el tiempo de espera en consecuencia.
Paz.
Me funciona
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
enableBtIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
startActivityForResult(enableBtIntent, Utils.REQUEST_DEVICE_DISCOVERABLE);
Deshabilita manualmente tu Bluetooth y luego ejecuta el código. Funcionará, sí.
Llegué a la misma conclusión en tres dispositivos que tengo.
- ANDROID v 4.3 y superior: EXTRA_DISCOVERABLE_DURATION 0 funciona sin límite
- ANDROIND v 4.1: EXTRA_DISCOVERABLE_DURATION 0 es máximo 1 hora. Tiene que cambiar manualmente a ningún límite en los parámetros.
arriba del nivel de api 14 EXTRA_DISCOVERABLE_DURATION 0 funciona con límite infinito pero debajo de esto funciona durante 1 hora como máximo.
Este código funciona para mí
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
startActivityForResult(intent, Utils.REQUEST_DEVICE_DISCOVERABLE);