web-dev-qa-db-ja.com

Android 6.0でのBluetooth Low Energy startScanはデバイスを検出しません

Nexus 5を使用してBluetooth Low Energyでアプリケーションを開発しています。Lollipopで動作し、現在はMarshmallowで動作していません。マニフェストおよびアクティビティのランタイムでACCESS_COARSE_LOCATIONおよびACCESS_FINE_LOCATION権限を設定します。

これはScanFiltersのリストです:

mScanFilterTest = new ScanFilter.Builder().build();
mScanFilter = new ArrayList<ScanFilter>();
mScanFilter.add(mScanFilterTest);

これらは設定です:

mScanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).setReportDelay(0)
                .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).build();

これらは私のコールバックです:

 mBLEScan = new ScanCallback() {
     @Override
     public void onScanResult(int callbackType, ScanResult result) {
         super.onScanResult(callbackType, result);
         Log.i(TAG, "******************************************");
         Log.i(TAG, "The scan result " + result);
         Log.i(TAG, "------------------------------------------");
         }
     };

これは私の電話です:

mBluetoothLeScanner.startScan(mScanFilter, mScanSettings, mBLEScan);

スキャンを開始しますが、デバイスは見つかりません。私を助けてください!!!!

46
Jacopo Tosi

私は同じ問題に苦労しました。修正するには、電話の設定で「ロケーション」(GPS)を有効にする必要があります、および実行時にアプリでロケーション許可をリクエストします。スキャンが適切に機能するには、両方を実行する必要があります。

場所の許可を要求するには、ダイアログまたは「いいね!」に以下を入力します。

yourActivity.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, yourPermissionRequestCode);

そして実装:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){
    if(requestCode == yourPermissionRequestCode)
    {
        ... //Do something based on grantResults
    }
}

yourActivityで、ユーザーが選択したものをすべて処理します。デバイスの位置情報サービスを有効にするには、次のことも行う必要があります。

Intent enableLocationIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
yourActivity.startActivityForResult(enableLocationIntent, yourServiceRequestCode);

以下を実装することにより、ユーザーが位置情報サービスを有効にしたかどうかを確認できます。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(requestCode == yourServiceRequestCode)
    {
        ...//Do whatever you need to
    }
}

yourActivityで。以下を実行して、位置情報(GPS)サービスを手動でオンにすることもできます。

Enter phone settings -> Select "Location" -> Then turn it on

電話設定では次のようになります。

Location (GPS) services enabled in Phone Settings

または、クイック設定ドロップダウンのこのように:

Location (GPS) services enabled in drop down settings

ユーザーが許可を有効にし、位置情報サービスを開始したら、スキャンを開始する必要があります。許可を有効にしている間にすでにスキャンしている場合、/onScanResultsにはまだ何も置かない位置情報サービスをオンにします

これがiBeacons/Bluetooth広告のバグなのか「機能」なのかわかりません(注:Bluetoothの技術的な広告ではなく、製品を販売するときの広告)。

これで問題が解決することを願っています!

EDIT追加するつもりでした。これはスキャンにのみ必要です。 BLEデバイスに接続したら、携帯電話の位置情報サービスをオフにできますが、デバイスに接続したままになります。ただし、新しいデバイスを検出したり接続したりすることはできず、すべての広告デバイスはonScanResultsから削除されます

64
V-PTR

@Jacopo Tosiが言ったように、場所の許可を求めなければならない。 こちら 方法を読むことができます。また、ロケーションもオンにする必要があります。なぜそれをしたのか分かりません。しかし、それが私がそれを機能させることができた唯一の方法です。

2
Maor Hadad

私の場合(HTC M9)、Bluetoothの下のAndroid設定メニューに移動し、BTデバイスを手動でスキャンする必要がありました。

0
CodingYourLife