java - 如何在 Android 中以编程方式检查蓝牙网络共享状态

标签 java android bluetooth tethering

有什么方法可以在 Android 2.3+(2.3+ 之后的任何版本)中以编程方式找出启用或禁用蓝牙网络共享?

我不是要启用/禁用它,而只是想知道它当前是否启用。

最佳答案

事实证明,BluetoothPan(个人区域网络)是网络共享的关键字。我仔细研究了 API 文档和 Android 源代码,但评论中的简短示例具有误导性。这张海报提供了一个示例,但我最初遇到了问题:
Android BluetoothPAN to create TCP/IP network between Android device and Windows7 PC

我尝试了各种其他方法,包括检查 BT 设备的 IP 地址。但是没有蓝牙网络设备存在,所以没有IP可以查询。
Detect USB tethering on 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) {
    }
}

关于java - 如何在 Android 中以编程方式检查蓝牙网络共享状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16299247/

相关文章:

android - 仅在 Android 上防止 'display:table' 垂直堆叠

Android软键盘监听器?

java - 在 Scala 中实现带条件的嵌套循环

java - 是否有包含/不包含时间间隔结束的标准?

java - 如何保护一种方法免受不同请求的影响

c++ - 低功耗蓝牙 : setting characteristic to byte array sends wrong values

android - 在不丢失与设备的连接的情况下将蓝牙连接实现到服务或应用程序类

java - 使用 Microsoft graph Java Sdk 创建发布请求以将用户添加到组

java.lang.ClassCastException : org. hibernate.hql.internal.ast.tree.SqlNode 无法转换为 org.hibernate.hql.internal.ast.tree.FromReferenceNode

android - 蓝牙适配器禁用并重新启用后如何让 Android 连接?