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
残念ながら、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
これは完全な解決策ではありませんが、提案された回避策 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;
}
}
そうは言っても、広告はNexus9タブレットでサポートされていることを確認しました。詳細については、こちらをご覧ください: http://developer.radiusnetworks.com/2014/11/18/beacon-transmission-with-Android-5.html
QuickBeaconアプリはNexus9で正常に動作しています。アプリにはビーコン形式オプションがあります。@ davidgyoungこのライブラリをiBeacon形式で送信するためのBeaconParserの正確な文字列を指定できますか?
更新: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を与えます