Обнаружение Bluetooth внутри AsyncTask

1

Я пытаюсь найти соседние устройства Bluetooth, чтобы выполнить эту задачу, используя AsyncTask. Код для моей AsyncTask находится под

public class DeviceScan extends AsyncTask<String, Void, ArrayList<String>> {


    ProgressDialog dialog;
    Context _context; 
    BluetoothAdapter adapter; 
    final BroadcastReceiver blueToothReceiver;


    /**
     * The constructor of this class
     * @param context The context of whatever activity that calls this AsyncTask. For instance MyClass.this or getApplicationContext()
     */

    public DeviceScan(Context context) {

        _context = context; 
        dialog = new ProgressDialog(_context); 
        adapter = BluetoothAdapter.getDefaultAdapter();
        blueToothReceiver = null; 

    }


    protected void onPreExecute() {

          dialog.setTitle("Please Wait");
          dialog.setMessage("Searching for devices..");
          dialog.setIndeterminate(true);
          dialog.setCancelable(false);
          dialog.show();

    }

    /*
     * Operations "behind the scene", do not interfere with the UI here!
     * (non-Javadoc)
     * @see android.os.AsyncTask#doInBackground(Params[])
     */
    @Override
    protected ArrayList<String> doInBackground(String... params) {

        //This arraylist should contain all the discovered devices. 
        final ArrayList<String> devices = new ArrayList<String>();

        // Create a BroadcastReceiver for ACTION_FOUND
        final BroadcastReceiver blueToothReceiver = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                // When discovery finds a device
                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 ListView
                    devices.add(device.getName() + "\n" + device.getAddress());
                }
            }
        };
        // Register the BroadcastReceiver
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        _context.registerReceiver(blueToothReceiver, filter);

        return devices;

    }


    /*
     * After the background thread has finished, this class will be called automatically 
     * (non-Javadoc)
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
     */
     protected void onPostExecute(ArrayList<String> result) {
         dialog.dismiss(); 
         Toast.makeText(_context, "Finished with the discovery!", Toast.LENGTH_LONG).show(); 


     }

     protected void onDestory() {
          _context.unregisterReceiver(blueToothReceiver);
     }
}

Как вы можете видеть, функция doInBackground возвращает Arraylist всех устройств. Моя проблема в том, что этот список вообще не содержит каких-либо объектов. Я уверен, что я включил устройства, которые можно Discoverable Любые советы будут оценены

Заранее спасибо!

РЕДАКТИРОВАТЬ

Ниже мой файл манифеста:

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

<uses-sdk android:minSdkVersion="11" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <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>

EDIT # 2

Я попытался добавить в список фиктивный объект вместо следующей строки кода

devices.add(device.getName().toString() + "\n" + device.getAddress().toString());

Я пытался

devices.add("Test");

Но когда я отлаживаю, аррайалист все еще пуст?

  • 0
    убедитесь, что у вас есть права на использование <roid-разрешения android: name = "android.permission.BLUETOOTH" /> <права использования android: name = "android.permission.BLUETOOTH_ADMIN" /> в манифесте
  • 0
    Это не проблема, смотрите мое обновление :)
Теги:

1 ответ

4
Лучший ответ

Прежде всего, у java нет функций. У него есть методы.

Во-вторых, вы не должны использовать AsyncTask здесь. AsyncTask используются для выполнения потенциально дорогостоящих операций с потока пользовательского интерфейса. Обнаружение Bluetooth является асинхронным, поэтому вам не нужно вводить несколько потоков для обнаружения других устройств. Кроме того, похоже, что все, что вы делаете в своей AsyncTask, определяет и регистрирует новый BroadCastReceiver. Это будет выполнено за несколько миллисекунд (создание/выполнение фактического AsyncTask может занять больше времени). В результате ваш метод onPostExecute будет вызываться сразу после регистрации ресивера. Вероятно, это вас путает.

Прочитайте эту документацию по Bluetooth в Android... она проведет вас через процесс настройки вашего приложения для обнаружения Bluetooth.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню