Как проверить статус Bluetooth-модема программно в Android
Есть ли способ узнать, что Bluetooth-модем включен или отключен программно в Android 2.3+(любая версия после 2.3+)?
Я не прошу включить / отключить его, а только узнать, включен он в настоящее время или нет.
1 ответ
Оказывается, BluetoothPan (персональная сеть) - это ключевое слово для привязки. Я изучал документацию по API и исходный код Android, но краткие примеры в комментариях вводили в заблуждение. Этот плакат предоставил пример, но у меня были проблемы с ним изначально:
Android BluetoothPAN для создания сети TCP/IP между устройством Android и ПК с Windows7
Я пробовал различные другие методы, включая проверку IP-адреса устройства BT. Однако сетевого устройства Bluetooth не существует, поэтому нет IP-адреса для проверки.
Определить USB-модем на Android
Вернуться к коду BluetoothPan... Пример в первом потоке был неполным (реализация ServiceListener отсутствует). Я попробовал стандартный, но вызов прокси-сервера isTetheringOn не удался. Важным моментом является то, что для обратного вызова onServiceConnected() требуется как минимум одна строка кода, или компилятор оптимизирует ее. Он также не должен отключать прокси, как в большинстве других примеров. Вот рабочий код:
BluetoothAdapter mBluetoothAdapter = null;
Class<?> classBluetoothPan = null;
Constructor<?> BTPanCtor = null;
Object BTSrvInstance = null;
Class<?> noparams[] = {};
Method mIsBTTetheringOn;
@Override
public void onCreate() {
Context MyContext = getApplicationContext();
mBluetoothAdapter = getBTAdapter();
try {
classBluetoothPan = Class.forName("android.bluetooth.BluetoothPan");
mIsBTTetheringOn = classBluetoothPan.getDeclaredMethod("isTetheringOn", noparams);
BTPanCtor = classBluetoothPan.getDeclaredConstructor(Context.class, BluetoothProfile.ServiceListener.class);
BTPanCtor.setAccessible(true);
BTSrvInstance = BTPanCtor.newInstance(MyContext, new BTPanServiceListener(MyContext));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
private BluetoothAdapter getBTAdapter() {
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
return BluetoothAdapter.getDefaultAdapter();
else {
BluetoothManager bm = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
return bm.getAdapter();
}
}
// Check whether Bluetooth tethering is enabled.
private boolean IsBluetoothTetherEnabled() {
try {
if(mBluetoothAdapter != null) {
return (Boolean) mIsBTTetheringOn.invoke(BTSrvInstance, (Object []) noparams);
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public class BTPanServiceListener implements BluetoothProfile.ServiceListener {
private final Context context;
public BTPanServiceListener(final Context context) {
this.context = context;
}
@Override
public void onServiceConnected(final int profile,
final BluetoothProfile proxy) {
//Some code must be here or the compiler will optimize away this callback.
Log.i("MyApp", "BTPan proxy connected");
}
@Override
public void onServiceDisconnected(final int profile) {
}
}