実現したいこと
検知したiBeaconの情報をLogcatに表示されるようにしたい。
発生している問題・分からないこと
検知した際にLogcatにUUIDやmajor, minorなどを表示できるはずが、表示されない。
該当のソースコード
MainActivity.java
1package com.example.myapplication; 2 3import android.os.Bundle; 4import android.os.RemoteException; 5import android.util.Log; 6 7import androidx.appcompat.app.AppCompatActivity; 8 9import org.altbeacon.beacon.Beacon; 10import org.altbeacon.beacon.BeaconConsumer; 11import org.altbeacon.beacon.BeaconManager; 12import org.altbeacon.beacon.BeaconParser; 13import org.altbeacon.beacon.MonitorNotifier; 14import org.altbeacon.beacon.RangeNotifier; 15import org.altbeacon.beacon.Region; 16 17import java.util.Collection; 18 19public class MainActivity extends AppCompatActivity implements BeaconConsumer { 20 21 private static final String IBEACON_FORMAT = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"; 22 23 private BeaconManager beaconManager; 24 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_main); 29 30 beaconManager = BeaconManager.getInstanceForApplication(this); 31 32 beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(IBEACON_FORMAT)); 33 34 beaconManager.addRangeNotifier(new RangeNotifier() { 35 @Override 36 public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 37 for (Beacon beacon : beacons) { 38 Log.d("MyActivity", "UUID:" + beacon.getId1() + ", major:" 39 + beacon.getId2() + ", minor:" + beacon.getId3() + ", RSSI:" 40 + beacon.getRssi() + ", TxPower:" + beacon.getTxPower() 41 + ", Distance:" + beacon.getDistance()); 42 } 43 try { 44 beaconManager.startRangingBeaconsInRegion(region); 45 } catch (RemoteException e) { 46 e.printStackTrace(); 47 } 48 } 49 }); 50 51 } 52 53 @Override 54 protected void onResume() { 55 super.onResume(); 56 beaconManager.bind(this); 57 } 58 59 @Override 60 protected void onPause() { 61 super.onPause(); 62 beaconManager.unbind(this); 63 } 64 65 @Override 66 public void onBeaconServiceConnect() { 67 final Region mRegion = new Region("iBeacon", null, null, null); 68 beaconManager.addMonitorNotifier(new MonitorNotifier() { 69 @Override 70 public void didEnterRegion(Region region) { 71 Log.d("iBeacon", "Enter Region"); 72 } 73 74 @Override 75 public void didExitRegion(Region region) { 76 Log.d("iBeacon", "Exit Region"); 77 } 78 79 @Override 80 public void didDetermineStateForRegion(int i, Region region) { 81 Log.d("MyActivity", "Determine State" + i); 82 } 83 84 }); 85 86 try { 87 beaconManager.startMonitoringBeaconsInRegion(mRegion); 88 } catch (RemoteException e) { 89 e.printStackTrace(); 90 } 91 } 92 93}
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApplication" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
監視領域の機能実装も行っていますが、「MyActivity state1」になるはずが、「state0」になります。
補足
特になし
altbeacon のバージョンや、 androidmanifest.xml の内容もご提示願えますか。
また、 state の表示までに他のログの出力もあるかと思いますが、それらはどうなっているのでしょうか。
AndroidManifest.xmlの内容を更新いたしました。
altbeaconのバージョンの確認方法がわからず、すみません。コード上ではbuild.gradle.ktsに「implementation(libs.android.beacon.library)」と定義しています。
実行すると多くのログが流れるのですが、どのログが該当するのかがわかりません。申し訳ありません。
編集有難う御座います。
バージョンは、 gradle フォルダ内の libs.versions.toml を参照してください。
バージョン カタログ ファイルを作成する
https://developer.android.com/build/migrate-to-catalogs?hl=ja
ログは、 Log.d に指定したタグでフィルター出来ると思います。
また見立ちやすいタグ(*を並べるとか)にすると埋もれにくいです。
折角ログを出すようにしているのに分からないのでは意味がありません。何処まで動いているのかの確認には絶対必要です。
質問内容自体が少し変わりましたが、表示が無いというのはログの出力自体が無いのか、それとも state のようにログは出ているけども内容が思ったものではないということなのか、どちらでしょう。(この辺りの表現は確実にして頂けると助かります。)
或いは無関係なものを消した後の一厘のログをコードのようにご提示頂ければ『百聞は一見に』的に分かり易いでしょう。
教えて頂きありがとうございます。
「androidBeaconLibrary = "2.20.6"」との表示がありました。
Log.dに指定したタグでフィルターをかけましたが、MyActivityしかかかりませんでした。
内容は質問に記した内容と変わらず、「MyActivity|com.example.myapplication|D|Determine State0」でした。
表示がないというのは、ログの出力自体がありません。参考にさせていただいている方が表示できてる内容(UUIDなど)が表示されない状態です。
下記のログは、実行した後に出力されたログで、なんとなく関係がありそうなもの、「E」となっているものなどです。自分が無関係と思うものを削っていますが、過不足ありましたら申し訳ありません。
system_server|D|applicationScale - 1.0
system_server|E|Permission violation - getConfiguredNetworks not allowed for uid=*****, packageName=com.appnextg.cleaner, reason=java.lang.SecurityException: Location mode is disabled for the device
system_server|D|mCompatibilityFlags - 0
system_server|D|applicationDensity - 480
system_server|D|applicationScale - 1.0
perfservice|E|IIop:: Iop HAL Service is not available.
com.example.myapplication|D|Checking for metadata for AppLocalesMetadataHolderService : Service not found
com.example.myapplication|W|Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
com.example.myapplication|I|BeaconManager started up on pid 5817 named 'com.example.myapplication' for application package 'com.example.myapplication'. isMainProcess=true
com.example.myapplication|D|Parsing beacon layout: m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25
com.example.myapplication|D|Parsing beacon layout: m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24
com.example.myapplication|I|Using immediateScanJobId from manifest: 208352939
com.example.myapplication|I|Using periodicScanJobId from manifest: 208352940
com.example.myapplication|W|Requested interval +5m0s0ms for job 208352940 is too small; raising to +15m0s0ms
com.example.myapplication|W|Requested flex 0 for job 208352940 is too small; raising to +5m0s0ms
com.example.myapplication|D|Determine State0
com.example.myapplication|I|Skipped 40 frames! The application may be doing too much work on its main thread.
com.example.myapplication|I|Build Config : S L 8.0.12 AArch64
com.example.myapplication|I|PFP: *****, ME: *****
com.example.myapplication|W|mapper 3.x is not supported
statsd|E|Found dropped events: 1 error -19 last atom tag 83 from uid *****
|E|poll() has timed out for /sys/module/msm_performance/events/cpu_hotplug
|E|Block on poll()
|E|Permission violation - getConfiguredNetworks not allowed for uid=*****, packageName=com.appnextg.cleaner, reason=java.lang.SecurityException: Location mode is disabled for the device
system_server|W|Scheduling restart of crashed service com.example.myapplication/org.altbeacon.beacon.service.ScanJob in 1000ms
system_server|W|Force removing ActivityRecord{21bd064 u0 com.example.myapplication/.MainActivity t2139 f}: app died, no saved state
system_server|E|UXEngine Trigger - Returning null
altbeacon が 2.20.6 である点了解しました。
検索すると GitHub に以下のような質問がありました。
altbeacon does not detect beacon devices on Android 12 and later #1197
https://github.com/AltBeacon/android-beacon-library/issues/1197
質問者のコードが kotlin で長く、また提示がうまく出来ていないのか切れ々々でとても読み難いです(私も読めてません^^; )が、何かヒントが隠されているかもしれません。
因みに m._.i さんの android のバージョンは幾つでしょうか。
また、 android のバージョンによって幾つかの権限の要求コードが必要ですが、それは大丈夫でしょうか。
https://altbeacon.github.io/android-beacon-library/requesting_permission.html
>Log.dに指定したタグでフィルターをかけましたが、MyActivityしかかかりませんでした。
ログに didEnterRegion や didExitRegion で指定しているタグ "iBeacon" が無いということですね。
Region に入れば didEnterRegion が呼ばれてログが出るでしょうから、入っておらず、従って didDetermineStateForRegion で 0 となるのは状況的には合っているように思います。
テストされている環境で iBeacon の範囲内に入っていることは確実でしょうか。
>参考にさせていただいている方が表示できてる
参考にされている方のコードが得られるようでしたら(権利的な問題とか無ければ)ご提示頂くことは可能でしょうか。
もしくは何処かに公開されている記事・コードでしたら URL でも構いません。
>GitHubに以下のような質問があった
調べてくださってありがとうございます。確認してみます。
実行に使用しているAndroidのバージョンは10です。
権限コードも確認しましたが、おそらく大丈夫そうです。
>テスト環境下でiBeaconの範囲内に入っていることは確実か
GooglePlayなどでインストールできる既存アプリで確認し、正常にiBeaconと繋がっていました。
テスト時もBluetoothと位置情報をONにして行っています。
以下は参考にさせて頂いているサイトです。全4編ですが、今回質問させていただいたのは、その3までです。また、サイトで公開されているコードをそのまま実行してもAndroid Studioのバージョン違いなどでうまく実行できなかったため、多少違う部分があるかと思います。
https://houwa-js.co.jp/2018/08/20180808/
>多少違う部分があるかと思います
似たことでちょっと気になる点がありました。
【Android】altBeacon ライブラリを使って領域監視を行う(v2.19以上対応)
https://qiita.com/kenmaeda51415/items/ac5a2d5a15783bbe9192#%E5%AE%9F%E8%A3%85
によると altbeacon 2.19 から BeaconConsumer が非推奨になる等インターフェースが変わっています。
削除では無いので動作するはずとは思いますが、 bind が不要になったり等メソッドの実行タイミング等が変わっている可能性はあるかもしれませんので、出来れば新しいインターフェースに沿った記事を参考にされたほうが良いかもしれません。
(以下勘違いのようなので削除)
質問は後から問題の解決を探す人への情報になりますので、消さないでください。
解決されましたら回答からベストアンサーを選ぶことで「解決済み」と表示されるようになります。
@質問者 giyskgさん
丁寧な回答とフォローで解決した上に追加の質問への対応もいただいたのに、質問をクローズもせず、用は済んだとばかりに削除なのでしょうか。ひどいですね。
[質問・回答を消去したい] https://teratail.com/help#delete-question
> 一般に質問・回答・コメント等の削除は原則不可としております。投稿いただいた質問や回答は、他に同じ問題を抱えている人の貴重な情報になるためです。
ユーザー名をみると何となく捨て垢っぽいですが、そういうつもりではないのであれば、質問内容を復帰させてください。
> ユーザー名をみると何となく捨て垢っぽいですが、そういうつもりではないのであれば、質問内容を復帰させてください。
残念ですが当該質問者様は恐らくもう読んでいない、或いは読んでいてもスルーしていると判断しましたので通報しました。
teratailサポートチームです。質問内容が意図的に抹消されていたため、運営により質問を復元いたしました。
