3

Android 2.3 以降 (2.3 以降のバージョン) で Bluetooth テザリングがプログラムで有効または無効になっていることを確認する方法はありますか?

有効化/無効化を求めているのではなく、現在有効になっているかどうかを知りたいだけです。

4

1 に答える 1

4

BluetoothPan (Personal Area Networking) がテザリングのキーワードであることがわかりました。API ドキュメントと Android ソース コードを詳しく調べましたが、コメント内の簡単な例は誤解を招くものでした。このポスターは例を提供しましたが、最初は問題がありました:
Android デバイスと Windows7 PC の間に TCP/IP ネットワークを作成する Android BluetoothPAN

BT デバイスの IP アドレスを確認するなど、さまざまな方法を試しました。ただし、Bluetooth ネットワーク デバイスが存在しないため、確認する IP はありません。
Android で USB テザリングを検出する

BluetoothPan コードに戻ります... 最初のスレッドの例は不完全でした (ServiceListener の実装はありません)。標準のものを試しましたが、isTetheringOnプロキシ呼び出しに失敗しました。重要な点は、onServiceConnected()コールバックに少なくとも 1 行のコードが必要であるか、コンパイラが最適化して削除することです。また、他のほとんどの例のようにプロキシを切断するべきではありません。作業コードは次のとおりです。

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) {
    }
}
于 2014-03-26T17:09:13.573 に答える