質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

1回答

138閲覧

Android StudioのLogcatにiBeaconの情報が表示されない

m._.i

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2025/01/08 13:53

編集2025/01/09 05:05

実現したいこと

検知した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」になります。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2025/01/08 15:56 編集

altbeacon のバージョンや、 androidmanifest.xml の内容もご提示願えますか。 また、 state の表示までに他のログの出力もあるかと思いますが、それらはどうなっているのでしょうか。
m._.i

2025/01/09 00:36

AndroidManifest.xmlの内容を更新いたしました。 altbeaconのバージョンの確認方法がわからず、すみません。コード上ではbuild.gradle.ktsに「implementation(libs.android.beacon.library)」と定義しています。 実行すると多くのログが流れるのですが、どのログが該当するのかがわかりません。申し訳ありません。
jimbe

2025/01/09 03:26

編集有難う御座います。 バージョンは、 gradle フォルダ内の libs.versions.toml を参照してください。 バージョン カタログ ファイルを作成する https://developer.android.com/build/migrate-to-catalogs?hl=ja ログは、 Log.d に指定したタグでフィルター出来ると思います。 また見立ちやすいタグ(*を並べるとか)にすると埋もれにくいです。 折角ログを出すようにしているのに分からないのでは意味がありません。何処まで動いているのかの確認には絶対必要です。 質問内容自体が少し変わりましたが、表示が無いというのはログの出力自体が無いのか、それとも state のようにログは出ているけども内容が思ったものではないということなのか、どちらでしょう。(この辺りの表現は確実にして頂けると助かります。) 或いは無関係なものを消した後の一厘のログをコードのようにご提示頂ければ『百聞は一見に』的に分かり易いでしょう。
m._.i

2025/01/09 05:04

教えて頂きありがとうございます。 「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
jimbe

2025/01/09 06:11 編集

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 でも構いません。
m._.i

2025/01/09 06:51

>GitHubに以下のような質問があった 調べてくださってありがとうございます。確認してみます。 実行に使用しているAndroidのバージョンは10です。 権限コードも確認しましたが、おそらく大丈夫そうです。 >テスト環境下でiBeaconの範囲内に入っていることは確実か GooglePlayなどでインストールできる既存アプリで確認し、正常にiBeaconと繋がっていました。 テスト時もBluetoothと位置情報をONにして行っています。 以下は参考にさせて頂いているサイトです。全4編ですが、今回質問させていただいたのは、その3までです。また、サイトで公開されているコードをそのまま実行してもAndroid Studioのバージョン違いなどでうまく実行できなかったため、多少違う部分があるかと思います。 https://houwa-js.co.jp/2018/08/20180808/
jimbe

2025/01/09 09:08 編集

>多少違う部分があるかと思います 似たことでちょっと気になる点がありました。 【Android】altBeacon ライブラリを使って領域監視を行う(v2.19以上対応) https://qiita.com/kenmaeda51415/items/ac5a2d5a15783bbe9192#%E5%AE%9F%E8%A3%85 によると altbeacon 2.19 から BeaconConsumer が非推奨になる等インターフェースが変わっています。 削除では無いので動作するはずとは思いますが、 bind が不要になったり等メソッドの実行タイミング等が変わっている可能性はあるかもしれませんので、出来れば新しいインターフェースに沿った記事を参考にされたほうが良いかもしれません。 それと、ご提示のコードで beaconManager.startRangingBeaconsInRegion を didRangeBeaconsInRegion メソッドの中でやるとは違うような気がします・・・。
guest

回答1

0

※回答でありません。

質問へのコメントを元に、 m._.i さんが参考にされている記事の最後のプログラムを手元の環境(+altbeacon 2.20.6)で非推奨等を使わないように作り直してみました。が、手元には iBeacon の送信機が無いので受信テスト出来ません。
お時間ありましたら実行してみて頂けないでしょうか。
こちらでは現在の所実行すると数秒おきに "InRegion 0" が出続けるようになります。

MainActivity.java

java

1import android.database.DataSetObserver; 2import android.os.*; 3import android.util.Log; 4import android.view.*; 5import android.widget.*; 6 7import androidx.annotation.NonNull; 8import androidx.appcompat.app.AppCompatActivity; 9import androidx.lifecycle.*; 10 11import org.altbeacon.beacon.*; 12 13import java.util.*; 14 15public class MainActivity extends AppCompatActivity { 16 private static final String LOG_TAG = "MainActivity"; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 TextView resultText = findViewById(R.id.result); 24 ListView listView = findViewById(R.id.beacon_list); 25 26 BeaconAdapter adapter = new BeaconAdapter(); 27 listView.setAdapter(adapter); 28 29 adapter.registerDataSetObserver(new DataSetObserver() { 30 @Override 31 public void onChanged() { 32 resultText.setText(String.format(Locale.getDefault(), "検知Beacon数: %d 台", adapter.getCount())); 33 } 34 @Override 35 public void onInvalidated() { 36 onChanged(); 37 } 38 }); 39 40 settingBeacon(adapter); 41 } 42 43 private void settingBeacon(BeaconAdapter adapter) { 44 BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); 45 String BEACON_LAYOUT = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"; 46 beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BEACON_LAYOUT)); 47 48 getLifecycle().addObserver(new DefaultLifecycleObserver() { 49 private final Region region = new Region("iBeacon", null, null, null); 50 @Override 51 public void onResume(@NonNull LifecycleOwner owner) { 52 beaconManager.startMonitoring(region); 53 beaconManager.startRangingBeacons(region); 54 } 55 @Override 56 public void onPause(@NonNull LifecycleOwner owner) { 57 beaconManager.stopMonitoring(region); 58 beaconManager.stopRangingBeacons(region); 59 } 60 }); 61 62 beaconManager.addMonitorNotifier(new MonitorNotifier() { 63 @Override 64 public void didEnterRegion(Region region) { 65 Log.d(LOG_TAG, "Enter Region"); 66 } 67 @Override 68 public void didExitRegion(Region region) { 69 Log.d(LOG_TAG, "Exit Region"); 70 } 71 @Override 72 public void didDetermineStateForRegion(int state, Region region) { 73 Log.d(LOG_TAG, "Determine State " + state); 74 } 75 }); 76 77 beaconManager.addRangeNotifier((beacons, region) -> { 78 Log.d(LOG_TAG, "InRegion " + beacons.size()); 79 adapter.set(beacons); 80 }); 81 } 82 83 private static class BeaconAdapter extends BaseAdapter { 84 private final List<BeaconItem> beaconItemList = new ArrayList<>(); 85 86 void set(Collection<Beacon> beacons) { 87 beaconItemList.clear(); 88 if(beacons != null) { 89 for(Beacon beacon : beacons) beaconItemList.add(new BeaconItem(beacon)); 90 } 91 notifyDataSetChanged(); 92 } 93 94 @Override 95 public int getCount() { 96 return beaconItemList.size(); 97 } 98 99 @Override 100 public Object getItem(int position) { 101 return beaconItemList.get(position); 102 } 103 104 @Override 105 public long getItemId(int position) { 106 return 0; 107 } 108 109 @Override 110 public View getView(int position, View convertView, ViewGroup parent) { 111 ViewHolder vh = convertView == null ? new ViewHolder(parent) : (ViewHolder)convertView.getTag(); 112 return vh.bind(beaconItemList.get(position)); 113 } 114 115 private static class ViewHolder { 116 final View itemView; 117 final TextView beacon; 118 119 ViewHolder(ViewGroup parent) { 120 itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.beacon_view, parent, false); 121 itemView.setTag(this); 122 123 beacon = itemView.findViewById(R.id.beacon); 124 } 125 126 View bind(BeaconItem item) { 127 beacon.setText(String.format(Locale.getDefault(), 128 "UUID:%s\nmajor:%s minor:%s\nRSSI:%d TxPower:%d Distance:%f", 129 item.uuid.toString(), item.major.toString(), item.minor.toString(), 130 item.rssi, item.txPower, item.distance)); 131 return itemView; 132 } 133 } 134 135 private static class BeaconItem { 136 final Identifier uuid, major, minor; 137 final int rssi, txPower; 138 final double distance; 139 140 BeaconItem(Beacon beacon) { 141 this(beacon.getId1(), beacon.getId2(), beacon.getId3(), beacon.getRssi(), beacon.getTxPower(), beacon.getDistance()); 142 } 143 BeaconItem(Identifier uuid, Identifier major, Identifier minor, int rssi, int txPower, double distance) { 144 this.uuid = uuid; 145 this.major = major; 146 this.minor = minor; 147 this.rssi = rssi; 148 this.txPower = txPower; 149 this.distance = distance; 150 } 151 } 152 } 153}

layout/activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <TextView 10 android:id="@+id/result" 11 android:layout_width="0dp" 12 android:layout_height="wrap_content" 13 android:text="検知Beacon数: 0 台" 14 android:textSize="18sp" 15 android:background="#e0e0e0" 16 app:layout_constraintEnd_toEndOf="parent" 17 app:layout_constraintStart_toStartOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20 <ListView 21 android:id="@+id/beacon_list" 22 android:layout_width="0dp" 23 android:layout_height="0dp" 24 app:layout_constraintBottom_toBottomOf="parent" 25 app:layout_constraintEnd_toEndOf="parent" 26 app:layout_constraintStart_toStartOf="parent" 27 app:layout_constraintTop_toBottomOf="@id/result" /> 28 29</androidx.constraintlayout.widget.ConstraintLayout>

layout/beacon_view.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<TextView xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id/beacon" 4 android:layout_width="match_parent" 5 android:layout_height="wrap_content" 6 android:textSize="16sp" />

投稿2025/01/09 13:01

jimbe

総合スコア13230

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m._.i

2025/01/10 04:57

作り直ししていただきありがとうございます。 ビーコンと接続した状態で実行したところ、実験端末(Android ver10)に「検知Beacon数:0台」のみ表示されました。 logに「InRegion 0」は出ました。
jimbe

2025/01/10 05:16

テストして頂きありがとうございます。お手数お掛けしてスイマセン。 InRegion 0 のログは数秒おきに流れましたでしょうか。 その状態でビーコンの範囲内の出入りをしたら如何でしょうか。
m._.i

2025/01/10 05:45

InRegion 0のログは数秒おきに流れています。 InRegion 0のログが流れている状態でビーコンに接続してみましたが、実行結果は先程の回答と変わりませんでした。
jimbe

2025/01/10 06:12 編集

何度もありがとうございます。ということは裏で何か動いているのは確かそうですね。もっと調べてみます。 情報を探している中で以下のサイトでサンプルを公開されているのを見つけました。 Android における Beacon を活用した新機能の実装 https://developers.cyberagent.co.jp/blog/archives/12901/ まだコード全てを見てはいませんが、これまで出たのとはまた違う出所からですので意味があるかと思います。 (どうも Region の値が違うようです…)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問