Wykrywanie urządzeń Bluetooth w Androidzie-startDiscovery()

Cel: Zbuduj aplikację na Androida, która wykrywa nazwy i adresy urządzeń BT w zasięgu i przesyła ich wartości do serwisu internetowego. Urządzenia BT nie zostały wcześniej połączone z urządzeniem hosta, chcę tylko sprawdzić wszystko, jak chodzę.

Co zrobiłem:

    Poored nad dokumentacją.
  1. zaimplementowano lokalną instancję adaptera BT urządzenia hosta.
  2. zaimplementowano powiadomienie, aby włączyć BT, jeśli nie jest włączone.
  3. zarejestrowanych odbiorników transmisji i zamierza analizować ACTION_FOUNDs wychodzące z startDiscovery () .
  4. zarejestrowanyBluetooth iBLUETOOTH_ADMIN uprawnienia w manifeście.

Rzeczy działają (jak testowane z przyrostowym logowaniem konsoli) aż do startDiscovery().


frustracja:

  • startDiscovery () -- podejrzewam, że przekazuję to w złym kontekście. W jakim kontekście powinna być ta metoda umieszczony wewnątrz, aby prawidłowo funkcjonować?
Jeśli udało Ci się uruchomić tę metodę, byłbym bardzo wdzięczny za Twoją mądrość.

UPDATE - Oto skrócona uproszczona wersja kodu, która sprawia mi smutek; to uproszczenie podsumowuje mój błąd. Ten kod działa, nie wyrzuca żadnych błędów cat.log ani innych błędów, po prostu nie daje żadnego wyjścia.

package aqu.bttest;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;

public class BT2Activity extends Activity {

private BluetoothAdapter mBTA;
private SingBroadcastReceiver mReceiver;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

  //register local BT adapter
    mBTA = BluetoothAdapter.getDefaultAdapter();
    //check to see if there is BT on the Android device at all
    if (mBTA == null){
        int duration = Toast.LENGTH_SHORT;
        Toast.makeText(this, "No Bluetooth on this handset", duration).show();
    }
    //let's make the user enable BT if it isn't already
    if (!mBTA.isEnabled()){
        Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBT, 0xDEADBEEF);
    }
    //cancel any prior BT device discovery
    if (mBTA.isDiscovering()){
        mBTA.cancelDiscovery();
    }
    //re-start discovery
    mBTA.startDiscovery();

    //let's make a broadcast receiver to register our things
    mReceiver = new SingBroadcastReceiver();
    IntentFilter ifilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    this.registerReceiver(mReceiver, ifilter);
}

private class SingBroadcastReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction(); //may need to chain this to a recognizing function
        if (BluetoothDevice.ACTION_FOUND.equals(action)){
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a Toast
            String derp = device.getName() + " - " + device.getAddress();
            Toast.makeText(context, derp, Toast.LENGTH_LONG);
        }
    }
}

}

Author: Majid Golshadi, 2012-05-12

1 answers

W jakim kontekście należy umieścić tę metodę, aby działała prawidłowo.

Mówiąc prościej, powinieneś użyć startDiscovery(), Gdy chcesz, aby Twoja aplikacja wykrywała lokalne urządzenia Bluetooth... na przykład, jeśli chcesz zaimplementować ListActivity, która skanuje i dynamicznie dodaje pobliskie urządzenia Bluetooth do ListView (Zobacz DeviceListActivity).

Twoje użycie metody startDiscovery() powinno wyglądać mniej więcej tak:

  1. Zdefiniuj zmienną klasy reprezentuje lokalny adapter Bluetooth.

    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    
  2. Sprawdź, czy Twoje urządzenie już "odkrywa". Jeśli tak, anuluj discovery.

    if (mBtAdapter.isDiscovering()) {
        mBtAdapter.cancelDiscovery();
    }
    
  3. Od razu po sprawdzeniu (i ewentualnie anulowaniu) trybu discovery, rozpocznij wykrywanie przez wywołanie,
    mBtAdapter.startDiscovery();
    
  4. Ogólnie należy bardzo uważać na przypadkowe pozostawienie urządzenia w trybie discovery. Wykonywanie wykrywania urządzenia jest ciężką procedurą dla adaptera Bluetooth i będzie zużywają dużo jego zasobów. Na przykład przed próbą nawiązania połączenia należy upewnić się, że zaznaczono/anulowano odkrycie. Najprawdopodobniej chcesz anulować discovery również w swojej metodzie onDestroy.

Daj mi znać, jeśli to pomogło... a jeśli nadal masz problemy, zaktualizuj odpowiedź za pomocą wyjścia logcat i / lub komunikatów o błędach, które otrzymujesz, a może mogę ci pomóc trochę więcej.
 17
Author: Alex Lockwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-12 01:55:03