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);
スキャンを開始しますが、デバイスは見つかりません。私を助けてください!!!!
私は同じ問題に苦労しました。修正するには、電話の設定で「ロケーション」(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
電話設定では次のようになります。
または、クイック設定ドロップダウンのこのように:
ユーザーが許可を有効にし、位置情報サービスを開始したら、スキャンを開始する必要があります。許可を有効にしている間にすでにスキャンしている場合、/onScanResults
にはまだ何も置かない位置情報サービスをオンにします
これがiBeacons/Bluetooth広告のバグなのか「機能」なのかわかりません(注:Bluetoothの技術的な広告ではなく、製品を販売するときの広告)。
これで問題が解決することを願っています!
EDIT追加するつもりでした。これはスキャンにのみ必要です。 BLEデバイスに接続したら、携帯電話の位置情報サービスをオフにできますが、デバイスに接続したままになります。ただし、新しいデバイスを検出したり接続したりすることはできず、すべての広告デバイスはonScanResults
から削除されます
@Jacopo Tosiが言ったように、場所の許可を求めなければならない。 こちら 方法を読むことができます。また、ロケーションもオンにする必要があります。なぜそれをしたのか分かりません。しかし、それが私がそれを機能させることができた唯一の方法です。
私の場合(HTC M9)、Bluetoothの下のAndroid設定メニューに移動し、BTデバイスを手動でスキャンする必要がありました。