2012-06-26 2 views
1

Я пытаюсь искать поблизости устройства Bluetooth, чтобы выполнить эту задачу я, используя AsyncTask код для моего AsyncTask находится подоткрытия Bluetooth внутри 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 возвращает Список_массивы всех устройств. Моя проблема в том, что этот список вообще не содержит каких-либо объектов. Я уверен, что у меня есть устройства, которые являются Discoverable Любые советы будут оценены

Заранее благодарен!

EDIT

Под мой файл манифеста:

<?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"); 

Но когда я отладки, то ArrayList все еще пусто?

+0

убедитесь, что у вас есть <использует-разрешение андроида: имя = "android.permission.BLUETOOTH" /> <использует-разрешение андроида: имя = "android.permission.BLUETOOTH_ADMIN" /> разрешения в manifast –

+0

Thats не проблема, см. мое обновление :) –

ответ

4

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

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

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

Смежные вопросы