Bluetooth: нет трансляции для ACTION_FOUND или ACTION_DISCOVERY_FINISHED - PullRequest
1 голос
/ 24 февраля 2012

Этот простой вещательный приемник никогда ничего не получает. Нет обнаруженного устройства от BluetoothDevice и нет запуска / остановки обнаружения от BluetoothAdapter.

Ранее в коде я проверял, что Bluetooth включен, и BluetoothAdapter правильно перечисляет три сопряженных устройства. Я пробовал разные варианты их отключения в телефоне вручную, и я включаю и выключаю видимость Bluetooth на трех удаленных устройствах. Но ничего не записывается с моего приемника вещания. Я запускаю / останавливаю открытие с помощью кнопок макета. startDiscovery() всегда возвращает true, cancelDiscovery() всегда возвращает false. Код в основном из Android Bluetooth Guide Dev.

Мой код:

package intrax.three;

import java.util.Set;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import intrax.three.R;

public class BtAct extends Activity {
    final String TAG = "BtAct";
    final int ENABLE_BLUETOOTH_REQ = 1;
    final String[] STATENAMES = {"Disconnected","Connecting","Connected","Disconnecting","STATE UNDEFINED","STATE UNDEFINED","STATE UNDEFINED","STATE UNDEFINED","STATE UNDEFINED","STATE UNDEFINED","Off","Turning on","On","Turning off"};
long discoveryStartTime = 0;

BluetoothAdapter btAdapter;
IntentFilter intentFilter;

protected void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.btlayout);

    btAdapter = BluetoothAdapter.getDefaultAdapter();

    /* Device's own Bluetooth */
    if (!btAdapter.isEnabled()) {
        Intent enableBluetoothIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBluetoothIntent, ENABLE_BLUETOOTH_REQ);
        Log.v(TAG, "The device's own bluetooth is NOT enabled.");
    }
    else {
        Log.v(TAG, "The device's own bluetooth IS enabled.");
        String  btOwnAddress =  btAdapter.getAddress();
        String  btOwnName =         btAdapter.getName();
        int         btOwnState =        btAdapter.getState();
        Log.v(TAG, btOwnAddress+" "+btOwnName);
        Log.v(TAG, STATENAMES[btOwnState]);
    }

    /** List paired devices **/
    Log.v(TAG, "Check for paired devices:");
    discoveryStartTime = SystemClock.uptimeMillis();
    Set<BluetoothDevice> allPairedDevices = btAdapter.getBondedDevices();
    Log.v(TAG, "It took "+(SystemClock.uptimeMillis()-discoveryStartTime+"ms to get paired devices. Starttime="+discoveryStartTime));
    if (allPairedDevices.size() > 0) {
        for (BluetoothDevice pairedDevice : allPairedDevices) {
            Log.v(TAG, pairedDevice.getName()+" "+pairedDevice.getAddress()+" was found");
        }
    }

    /* Remote bluetooth */
    Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,0);
    startActivity(discoverableIntent);

    intentFilter = new IntentFilter();
    intentFilter.addAction("ACTION_FOUND");
    intentFilter.addAction("ACTION_DISCOVERY_STARTED");
    intentFilter.addAction("ACTION_DISCOVERY_FINISHED");

    /* User interface */
    Button bStartScan =(Button)findViewById(R.id.buttonStartScan);
    bStartScan.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Log.v(TAG, "intentReceiver="+intentReceiver);
            Log.v(TAG, "Discovery started");
            boolean bol = btAdapter.startDiscovery();
            Log.v(TAG, "Returned from discovery, start="+bol);
            Log.v(TAG, "Disc enabled="+btAdapter.isDiscovering());
        }
    });//END bStart
    Button bStopScan =(Button)findViewById(R.id.buttonStopScan);
    bStopScan.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Log.v(TAG, "bStopScan clicked");
            if (btAdapter.isDiscovering()) {
                 boolean bol = btAdapter.cancelDiscovery();
                    Log.v(TAG, "Discovery canceled="+bol);
            };
            Log.v(TAG, "still discovering="+btAdapter.isDiscovering());
        }
    });//END bStop


}//END onCreate


private BroadcastReceiver intentReceiver = new BroadcastReceiver() {  // Abstract class
    public void onReceive(Context context, Intent receivedIntent) {
        Log.v(TAG, "Entered intentReceiver");
        if (BluetoothDevice.ACTION_FOUND.equals(receivedIntent.getAction())) 
        {
            Log.v(TAG, "Found after="+(SystemClock.uptimeMillis()-discoveryStartTime));
            BluetoothDevice foundDevice = receivedIntent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            Log.v(TAG, foundDevice.getName()+" "+foundDevice.getAddress()+" was found");
            BluetoothDevice foundDeviceClass = receivedIntent.getParcelableExtra(BluetoothDevice.EXTRA_CLASS);
            Log.v(TAG, "BT class: "+foundDeviceClass.toString());
        }
        else if (btAdapter.ACTION_DISCOVERY_STARTED.equals(receivedIntent.getAction())) {
            discoveryStartTime = SystemClock.uptimeMillis();
        }
        else if (btAdapter.ACTION_DISCOVERY_FINISHED.equals(receivedIntent.getAction())) {
            Log.v(TAG, "Discovery lasted: "+(SystemClock.uptimeMillis()-discoveryStartTime+"ms Starttime="+discoveryStartTime));
        }
        Log.v(TAG, "intentReceiver finished");
    }//END onReceive
};//END BroadcastReceiver

protected void onActivityResult(int requestCode, int resultCode, Intent resultIntent) {
    super.onActivityResult(requestCode, resultCode, resultIntent);
    switch(requestCode) {
    case ENABLE_BLUETOOTH_REQ:
        if(resultCode==RESULT_OK) {
            Log.v(TAG, "Bluetooth successfully enabled by request");
        }
        else {
            Log.v(TAG, "Bluetooth was not enabled. Finishing.");
            finish();
        }
    }//END switch
}//END onActivityResult

protected void onResume() {
    Log.v(TAG, "onResume");
    super.onResume();
    registerReceiver(intentReceiver, intentFilter);
    Log.v(TAG, "intentReceiver="+intentReceiver);
}

protected void onPause() {
    Log.v(TAG, "onPause");
    super.onPause();
    if (intentReceiver != null) {
        Log.v(TAG, "intentReceiver to be unregistered");
        unregisterReceiver(intentReceiver);
    }
}
}//END Class

ИЗМЕНИТЬ СНОВА: Изменено на:

intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

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

02-24 14:12:23.096: D/InputMethodManager(28164): dispatchKeyEvent
02-24 14:12:23.096: V/InputMethodManager(28164): DISPATCH KEY: com.android.internal.view.IInputMethodSession$Stub$Proxy@47c89938
02-24 14:12:23.156: D/InputMethodManager(28164): dispatchKeyEvent
02-24 14:12:23.156: V/InputMethodManager(28164): DISPATCH KEY: com.android.internal.view.IInputMethodSession$Stub$Proxy@47c89938

Ответы [ 4 ]

2 голосов
/ 24 февраля 2012

похоже, что вы не регистрируете широковещательные приемники в своем коде:

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

в вашем onResume:

registerReceiver(intentReceiver , intFilter);

в onPause:

unregisterReceiver(intentReceiver);
2 голосов
/ 17 октября 2013

У меня была та же проблема, следуйте моему решению:

if (BluetoothDevice.ACTION_FOUND.equals(intent.getAction()) && sBluetoothAdapter.isDiscovering()) {

После того, как я отменил свое обнаружение, и если даже в этом случае BroadcastReceiver перехватывает BluetoothDevice.ACTION_FOUND, флаг обнаружения будет "ложным".

У меня работает.

Любые сомнения, я здесь.

С уважением

1 голос
/ 13 марта 2014

Проблема обнаружения

Не полностью связана с вашим вопросом, но, тем не менее, следует отметить, что, поскольку обнаружение является "интенсивным процессом", оно происходит, когда планировщик этого хочет.Если ваш код выглядит примерно так:

startDiscovery();
while(adapter.isDiscovering()){
   // Something Here
}

Код просто пропустит блок while, потому что он еще не начал обнаружение.Быстрое и, конечно, грязное исправление - это сделать следующее:

startDiscovery();
while(!adapter.isDiscovering());
while(adapter.isDiscovering()){
   // Something Here
}

Это абсолютно противно и не должно работать, но работает. Я тоже не знаю.

(Не связано: кто-нибудь знает, почему событие ACTION_FOUND никогда не запускается ?, Я посмотрел свой логин в adb и, используя меню настроек bluetooth, увидел действие.DISCOVERY_STARTED затем через некоторое время действие. DISCOVERY_FINISHED, но нет события FOUND, только BluetoothEventManager: DeviceFoundHandler created new CachedBluetoothDevice)

1 голос
/ 24 февраля 2012

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

Intent discoverableIntent = new Intent(
    BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,0);
startActivity(discoverableIntent);

в onCreate() а затем вышеуказанный код

...