Как включить/выключить Bluetooth на G1 программно
Мы уже писали о программном включениии/выключении GPS на G1 теперь скажем немного о Bluetooth.
Процесс аналогичен. Всё работает через рефлексию, через вызов приватных методов isEnable, enable и disable службы Bluetooth.
package maximyudin.usefulswitchers;
import java.lang.reflect.Method;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
/**
* Класс для работы с Bluetooth
*
* @author Maxim Yudin
*
*/
public class BluetoothDevice {
public final String ENABLED_ACTION = "android.bluetooth.intent.action.ENABLED";
public final String DISABLED_ACTION = "android.bluetooth.intent.action.DISABLED";
private final Context mContext;
private Object mDevice;
private Method mEnable;
private Method mDisable;
private Method mIsEnabled;
private IntentFilter mIntentFilter;
private boolean mWaitState;
private boolean mIsBusy = false;
public BluetoothDevice(Context context) {
mContext = context;
try {
mDevice = mContext.getSystemService("bluetooth");
if (mDevice != null) {
Class<?> bluetoothService = mDevice.getClass();
mEnable = bluetoothService.getMethod("enable");
mEnable.setAccessible(true);
mDisable = bluetoothService.getMethod("disable");
mDisable.setAccessible(true);
mIsEnabled = bluetoothService.getMethod("isEnabled");
mIsEnabled.setAccessible(true);
}
mIntentFilter = new IntentFilter(ENABLED_ACTION);
mIntentFilter.addAction(DISABLED_ACTION);
mIsBusy = false;
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Включение Bluetooth
*
* @return Возвращает true, если запрос на включение был выполнен; false,
* если нет. Оповещение о реальном включении Bluetooth происходит в
* OnChangeListener
*/
public boolean enable() {
try {
if ((Boolean) mEnable.invoke(mDevice) == true) {
mIsBusy = true;
mWaitState = true;
}
callOnChangeListener();
} catch (Exception e) {
e.printStackTrace();
}
return mIsBusy;
}
/**
* Выключение Bluetooth
*
* @return Возвращает true, если запрос на выключение был выполнен; false,
* если нет. Оповещение о реальном выключении Bluetooth происходит в
* OnChangeListener
*/
public boolean disable() {
try {
if ((Boolean) mDisable.invoke(mDevice) == true) {
mIsBusy = true;
mWaitState = false;
}
callOnChangeListener();
} catch (Exception e) {
e.printStackTrace();
}
return mIsBusy;
}
/**
* Возвращает true, если Bluetooth включен, и false, если нет.
*/
/**
* Возвращает состояние Bluetooth
*
* @return Возвращает true, если Bluetooth включен; false, если нет.
*/
public boolean isEnabled() {
boolean bEnabled = false;
try {
bEnabled = (Boolean) mIsEnabled.invoke(mDevice);
} catch (Exception e) {
e.printStackTrace();
}
return bEnabled;
}
/**
* @return Возвращает true, если устройство в процессе включения/выключения
*/
public boolean isBusy() {
return mIsBusy;
}
/**
* Возвращает строку, содержащую текущее состояние Bluetooth, до
* окончательного включения/выключения
*/
public String getStatus() {
String str = null;
if (isBusy()) {
if (mWaitState == true)
str = mContext.getString(R.string.bluetoothturningon);
else
str = mContext.getString(R.string.bluetoothturningoff);
}
return str;
}
/**
* Вызывается, если Activity входит в приостановленное состояние Выключается
* прием широковещательных намерений через BroadcastReceiver
*/
public void pause() {
mContext.unregisterReceiver(mBluetoothReceiver);
}
/**
* Вызывается, если Activity выходит из приостановленного состояния
* Регистрирует прием широковещательных намерений через BroadcastReceiver
*/
public void resume() {
mContext.registerReceiver(mBluetoothReceiver, mIntentFilter);
}
/**
* BroadcastReceiver оповещает, когда реально изменится состояние Bluetooth
* (enable/disable)
*/
private final BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ENABLED_ACTION)) {
} else if (action.equals(DISABLED_ACTION)) {
}
mIsBusy = false;
callOnChangeListener();
}
};
/**
* Используется для управления событиями, которые изменяют состояния
* Bluetooth
*/
protected OnChangeListener mOnChangeListener = null;
/**
* Вызывает OnChangeListener, если он определен
*/
protected void callOnChangeListener() {
if (mOnChangeListener != null) {
mOnChangeListener.onChange(this);
}
}
/**
* Регистрирует обратный вызов (callback), когда изменяется состояние
* Bluetooth
*
* @param listener
* Обратный вызов, который будет запущен
*/
public void setOnChangeListener(OnChangeListener listener) {
mOnChangeListener = listener;
}
/**
* Определение интерфейса для обратного вызова changes.
*/
public interface OnChangeListener {
/**
* Вызывается, когда изменяется состояние Bluetooth
*
* @param device
* Bluetooth-устройство.
*/
void onChange(BluetoothDevice device);
}
}
А вот пример Bluetooth-устройства
bluetoothDevice = new BluetoothDevice(this);
bluetoothDevice.setOnChangeListener(new BluetoothDevice.OnChangeListener() {
public void onChange(BluetoothDevice device) {
if (!device.isBusy()) {
// когда устройство уже окончательно будет включенно/отключено,
// тут вы можете написать любой код обновляющий допустим
// какие-нибудь TextView, говорящие пользователю
// о текущем состоянии Bluetooth-устройства
}
}
});
таков обработчик события onChange.
Копи-паста
Опубликовано Гость (не проверено) в Пнд, 16/03/2009 - 00:22.Копи-паста што-ли?
http://habrahabr.ru/blogs/android/47430/
Материалы попадают и на наш
Опубликовано Denai в Пнд, 23/03/2009 - 04:55.Материалы попадают и на наш сайт и на хабр не всегда из первоисточников(их зачастую слишком сложно определить, тем более что гугл может их светить далеко не в топ 1000 по большинству запросов), а в результате обработки различных прочтённых новостей, исходники же копируются один в один ибо это исходники. Всякое может быть, но тупо копипастить - это не совсем стиль нашего сайта, уж извините.
Авторские комментарии сохранены. С хабра взят хорошо подсвеченный текст исходника.