Я пытаюсь найти соседние устройства 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");
Но когда я отлаживаю, аррайалист все еще пуст?
Прежде всего, у java нет функций. У него есть методы.
Во-вторых, вы не должны использовать AsyncTask
здесь. AsyncTask
используются для выполнения потенциально дорогостоящих операций с потока пользовательского интерфейса. Обнаружение Bluetooth является асинхронным, поэтому вам не нужно вводить несколько потоков для обнаружения других устройств. Кроме того, похоже, что все, что вы делаете в своей AsyncTask
, определяет и регистрирует новый BroadCastReceiver
. Это будет выполнено за несколько миллисекунд (создание/выполнение фактического AsyncTask
может занять больше времени). В результате ваш метод onPostExecute
будет вызываться сразу после регистрации ресивера. Вероятно, это вас путает.
Прочитайте эту документацию по Bluetooth в Android... она проведет вас через процесс настройки вашего приложения для обнаружения Bluetooth.