如何以编程方式检查Android的蓝牙绑定状态(How to check Bluetooth tet

2019-09-01 11:56发布

有没有办法找出蓝牙网络中启用或程序的Android 2.3+禁用(2.3+之后的任何版本)?

我没有要求启用/禁用它,但只知道它是否是当前还是未启用。

Answer 1:

事实证明,BluetoothPan(个人区域网络)是圈养的关键字。 我凝视着API文档和Android源代码,但在评论简短的例子是误导性的。 这张海报提供了一个例子,但我有麻烦与它最初:
Android的BluetoothPAN打造的Android设备和Windows7 PC之间的TCP / IP网络

我试过各种方法,包括检查BT设备的IP地址。 但是没有蓝牙网络设备存在,所以没有IP检查。
检测在Android USB绑定

回到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) {
    }
}


文章来源: How to check Bluetooth tethering status programmatically in Android