web-dev-qa-db-ja.com

BluetoothLeAdvertiserはAndroid 5.0のNexus5で動作しますか?

Nexus5をAndroid 5.0プレビューリリースhammerhead-lpx13dにフラッシュした後、OSはBluetoothLEアドバタイズメントをサポートしなくなったことを報告します。

((BluetoothManager) this.getSystemService(Context.BLUETOOTH_SERVICE))
    .getAdapter().getBluetoothLeAdvertiser()

常にnullを返します。さらに、新しい方法:

((BluetoothManager) this.getSystemService(Context.BLUETOOTH_SERVICE))
    .getAdapter().isMultipleAdvertisementSupported()

常にfalseを返します

6月のNexus5の最初のAndroid Lプレビューリリースで有効なオブジェクトを返すために使用された最初のメソッド。最新のアップデートをフラッシュした後、それはなくなりました。

誰か他の人を見ますか?

編集:これは、Googleで問題を開いた少なくとも1人の人によって複製されました: https://code.google。 com/p/Android-developer-preview/issues/detail?id = 157

20
davidgyoung

残念ながら、Googleからの公式の回答はいいえ、Nexus 5は広告をサポートしなくなりました。

Android 5.0LollipopでBLEペリフェラルモードを導入しました。Nexus6とNexus9は、BLEペリフェラルモードをサポートする最初の2つの製品Nexusデバイスです。ハードウェアチップセットの依存関係により、古いNexusデバイス(4/5/7)Lollipopの機能にアクセスできなくなります。

Danielhoによる問題1570のコメント#52を参照してください... @ google.com:BLEアドバタイズモードが機能していません https://code.google.com/p/Android-developer-preview/issues/detail?id= 157

そうは言っても、広告はNexus9タブレットでサポートされていることを確認しました。詳細については、こちらをご覧ください: http://developer.radiusnetworks.com/2014/11/18/beacon-transmission-with-Android-5.html

21
davidgyoung

これは完全な解決策ではありませんが、提案された回避策 Google Codeにmattprecによって投稿されました 。これにより、パブリックAPIを使用する代わりに、プライベートコンストラクターを呼び出すことでBluetoothLeAdvertiserインスタンスを取得できます。残念ながら、Nexus5およびNexus7 2013エディションでのテストの報告によると、インスタンスを取得した後でも、オブジェクトを使用して広告を出すことはできません。また、動作させることができたとしても、非公開APIを使用しているため、Android)のマイナーコードリリースで破損する可能性があることに注意してください。

ちなみに、そのページからコピーしたコードスニペットは次のとおりです。

private static BluetoothLeAdvertiser getAdvertiserHack(BluetoothAdapter adapter) {
  try {
    Class<? extends BluetoothAdapter> adapterClass = adapter.getClass();
    Field advertiserField = adapterClass.getDeclaredField("sBluetoothLeAdvertiser");
    advertiserField.setAccessible(true);
    Object advertiser = advertiserField.get(adapter);
    if (advertiser == null) {
      Field bluetoothManagerServiceField = adapterClass.getDeclaredField("mManagerService");
      bluetoothManagerServiceField.setAccessible(true);
      Object bluetoothManagerService = bluetoothManagerServiceField.get(adapter);

      Constructor<?> constructor = BluetoothLeAdvertiser.class.getDeclaredConstructor(
          bluetoothManagerServiceField.getType());
      constructor.setAccessible(true);
      advertiser = constructor.newInstance(bluetoothManagerService);

      advertiserField.set(adapter, advertiser);
    }
    return (BluetoothLeAdvertiser) advertiser;
  } catch (Exception e) {
    return null;
  }
}
6
davidgyoung

そうは言っても、広告はNexus9タブレットでサポートされていることを確認しました。詳細については、こちらをご覧ください: http://developer.radiusnetworks.com/2014/11/18/beacon-transmission-with-Android-5.html

QuickBeaconアプリはNexus9で正常に動作しています。アプリにはビーコン形式オプションがあります。@ davidgyoungこのライブラリをiBeacon形式で送信するためのBeaconParserの正確な文字列を指定できますか?

1
dzakens

更新:Android-beacon-library/BLE Android SDKまでの関連質問。startAdvertisingメソッドを呼び出さずに、バックグラウンドで実行されている広告サービスがあるかどうかを確認する可能性はありますか?

更新:

これに記録する: https://code.google.com/p/Android-developer-preview/issues/detail?id=1570#c52

現在、Nexus6とNexus9のみがAndroid 5.0でBLEペリフェールモードをサポートしています

更新:Nexus5で作業していますAndroid 5.0ビルド番号LPX13D

これによると https://stackoverflow.com/a/26611779/190642

実装後、回避策bluetoothAdvertiserはnullではありません。 bluetoothAdvertiserからstartAdvertisingを呼び出す

bluetoothAdvertiser.startAdvertising(settingsBuilder.build(), dataBuilder.build(), advertiseCallback);

どこ

private AdvertiseCallback advertiseCallback = new AdvertiseCallback() {

        @Override
        public void onStartSuccess(AdvertiseSettings settingsInEffec) {

        }

        @Override
        public void onStartFailure(int result) {
            if (result == ADVERTISE_FAILED_DATA_TOO_LARGE) {
                Log.d(TAG, "Failed to start advertising as the advertise data to be broadcasted is larger than 31 bytes.");
            }
            else if(result == ADVERTISE_FAILED_TOO_MANY_ADVERTISERS){
                Log.d(TAG, "Failed to start advertising because no advertising instance is available.");
            }
            else if(result == ADVERTISE_FAILED_ALREADY_STARTED){
                 Log.d(TAG, "Failed to start advertising as the advertising is already started.");
            }
            else if(result == ADVERTISE_FAILED_INTERNAL_ERROR){
                Log.d(TAG, "Operation failed due to an internal error.");
            }
            else if(result == ADVERTISE_FAILED_FEATURE_UNSUPPORTED){
                Log.d(TAG, "This feature is not supported on this platform.");
            }
            else {
                Log.d(TAG, "There was unknown error.");
            }

        }

    };

常にエラーコード5(ADVERTISE_FAILED_FEATURE_UNSUPPORTED)でコールバックonStartFailureを与えます

1
dzakens