2

現在、ボタンをクリックするだけでスキャンモードをからSCAN_MODE_CONNECTABLE_DISCOVERABLEに変更する必要があるBluetoothアプリに取り組んでいます。SCAN_MODE_CONNECTABLE

次のインテントを使用してDiscoverableに設定しています。

Intent discoverableIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent .putExtra( BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DISOVERABLE_DURATION);
startActivityForResult(discoverableIntent, REQUEST_DISCOVERABLE_BT);

私が設定したところDISOVERABLE_DURATION=300;

SCAN_MODE_CONNECTABLE今、私はその間の発見可能性をスキップし、その状態をのみに変更したいと思います。

親切に私に適切な解決策を提供してください../

4

3 に答える 3

2

それはかなり古い質問ですが、ユーザーの許可なしに Bluetooth のスキャンモードを切り替えることができます (私がテストした限り) 時間は無制限です。これには Android API でリフレクションを使用する必要があるため、これは公式の API ではありません。もちろん、あなたは自分の責任でそれを使用しています:)以下は、BTアダプターを検出可能にするために使用しているコードです。

private boolean setBluetoothScanMode(int scanMode){
    Method method = null;
    final BluetoothAdapter btAdapter = btManager.getAdapter();

    if(!btAdapter.isEnabled()){
        Log.d(LCAT, "BT adapter is off, turning on");
        btAdapter.enable();
    }

    try {
        method = btAdapter.getClass().getMethod("setScanMode", int.class);
    } catch (SecurityException e) {
        return false;
    } catch (NoSuchMethodException e) {
        return false;
    }

    try {
      method.invoke(btAdapter, scanMode);
    } catch (IllegalArgumentException e) {
        return false;
    } catch (IllegalAccessException e) {
        return false;
    } catch (InvocationTargetException e) {
        return false;
    }
    return true;
}

また、権限が必要です:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

このデバイスをスキャン モードにする必要がある場合は、int scanMode 引数を渡して選択します。Android API 23 で動作しています。

于 2016-01-27T09:30:21.477 に答える
1

SCAN_MODE_NONE で新しいインテントを開始してスキャンを停止し、SCAN_MODE_CONNECTABLE で再度開始して、接続可能モードのみで再度スキャンします。

于 2013-02-06T18:19:03.870 に答える
1

4.2 以降の Android デバイスのスキャン モードは、サードパーティ (非カーネル/非システム) アプリケーションでは設定できません。SCAN_MODE_CONNECTABLE_DISCOVERABLEで特定の期間を設定するオプションを使用して、検出 ( ) のみを有効にすることができますEXTRA_DISCOVERABLE_DURATION期間パラメーターを 1 に設定することで、効果的にディスカバリーを取り消すことができます。

証拠として、BluetoothAdapter.javaに焦点を当てて、 Android Sourceをざっと見てみましょう。

/**
 * Set the Bluetooth scan mode of the local Bluetooth adapter.
 * <p>The Bluetooth scan mode determines if the local adapter is
 * connectable and/or discoverable from remote Bluetooth devices.
 * <p>For privacy reasons, discoverable mode is automatically turned off
 * after <code>duration</code> seconds. For example, 120 seconds should be
 * enough for a remote device to initiate and complete its discovery
 * process.
 * <p>Valid scan mode values are:
 * {@link #SCAN_MODE_NONE},
 * {@link #SCAN_MODE_CONNECTABLE},
 * {@link #SCAN_MODE_CONNECTABLE_DISCOVERABLE}.
 * <p>If Bluetooth state is not {@link #STATE_ON}, this API
 * will return false. After turning on Bluetooth,
 * wait for {@link #ACTION_STATE_CHANGED} with {@link #STATE_ON}
 * to get the updated value.
 * <p>Requires {@link android.Manifest.permission#WRITE_SECURE_SETTINGS}
 * <p>Applications cannot set the scan mode. They should use
 * <code>startActivityForResult(
 * BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE})
 * </code>instead.
 *
 * @param mode valid scan mode
 * @param duration time in seconds to apply scan mode, only used for
 *                 {@link #SCAN_MODE_CONNECTABLE_DISCOVERABLE}
 * @return     true if the scan mode was set, false otherwise
 * @hide
 */
public boolean setScanMode(int mode, int duration) {
    if (getState() != STATE_ON) return false;
    try {
        synchronized(mManagerCallback) {
            if (mService != null) return mService.setScanMode(mode, duration);
        }
    } catch (RemoteException e) {Log.e(TAG, "", e);}
    return false;
}

ソースに記載されているように、「アプリケーションはスキャンモードを設定できません」。API の外部でモードを手動でスキャンするには、WRITE_SECURE_SETTINGS パーミッションが必要です。これは、サードパーティ アプリケーションでは不可能です

于 2014-04-23T15:39:07.680 に答える