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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

1回答

6679閲覧

AltBeaconライブラリでBeaconを読み取れない

nkymdesu

総合スコア7

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2018/05/22 07:22

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
Android Studio 3.0(JAVA)でビーコンからのデータをAndroidで受け取ろうとしています。
当方、Android開発を始めて1ヵ月も経たない初心者なため、以下のサイトをほぼそのまま参考にし実行したところエラーとなり困っています。

https://qiita.com/gupuru/items/ae67e619832ca20c9f3f

どうか助けてください。お願いいたします。

発生している問題・エラーメッセージ

①ビーコン(他のアプリでデータを発信していることを確認済み)に近づいても didEnterRegion()が実行されない。

②didEnterRegion()とdidExitRegion()に

beaconManager.startRangingBeaconsInRegion(mRegion); beaconManager.stopRangingBeaconsInRegion(mRegion);

を入れると

エラー Unhandled exception: android.os.RemoteException

となる。

MainActivity.java

Java

1package com.example.test.beaconread; 2 3import android.os.RemoteException; 4import android.support.v7.app.AppCompatActivity; 5import android.os.Bundle; 6import android.util.Log; 7 8import org.altbeacon.beacon.Beacon; 9import org.altbeacon.beacon.BeaconConsumer; 10import org.altbeacon.beacon.BeaconManager; 11import org.altbeacon.beacon.BeaconParser; 12import org.altbeacon.beacon.Identifier; 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 //定数 22 private static final String IBEACON_FORMAT = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"; 23 24 private BeaconManager beaconManager; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 Log.d("Beacon", "onCreate Success!!"); 31 32 //インスタンス化 33 beaconManager = BeaconManager.getInstanceForApplication(this); 34 //AltBeaconのParserをiBeaconに設定する 35 beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(IBEACON_FORMAT)); 36 37 } 38 39 @Override 40 protected void onResume() { 41 super.onResume(); 42 // サービスの開始 43 beaconManager.bind(this); 44 Log.d("Beacon", "onResume Success!!"); 45 } 46 47 @Override 48 protected void onPause() { 49 super.onPause(); 50 // サービスの停止 51 beaconManager.unbind(this); 52 Log.d("Beacon", "onPause Success!!"); 53 } 54 55 @Override 56 public void onBeaconServiceConnect() { 57 final Region mRegion = new Region("ibeacon", null, null, null); 58 59 beaconManager.addMonitorNotifier(new MonitorNotifier() { 60 @Override 61 public void didEnterRegion(Region region) { 62 // 領域侵入 63 Log.d("Beacon", "didEnterRegion Success!!"); 64 65 //beaconManager.startRangingBeaconsInRegion(mRegion); //エラー② 66 } 67 68 @Override 69 public void didExitRegion(Region region) { 70 // 領域退出 71 Log.d("Beacon", "didExitRegion Success!!"); 72 73 //beaconManager.stopRangingBeaconsInRegion(mRegion); //エラー② 74 } 75 76 @Override 77 public void didDetermineStateForRegion(int i, Region region) { 78 // 領域に対する状態が変化 79 Log.d("Beacon", "didDetermineStateForRegion Success!!"); 80 } 81 82 }); 83 84 beaconManager.addRangeNotifier(new RangeNotifier() { 85 @Override 86 public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 87 Log.d("Beacon" , "addRangeNotifier Success!!"); 88 // 検出したビーコンの情報を全部Logに書き出す 89 for(Beacon beacon : beacons) { 90 // ログの出力 91 Log.d("Beacon", "UUID:" + beacon.getId1() + ", major:" + beacon.getId2() 92 + ", minor:" + beacon.getId3() + ", Distance:" + beacon.getDistance() 93 + ",RSSI" + beacon.getRssi()); 94 } 95 } 96 }); 97 98 try { 99 //ビーコン情報の監視を開始 100 beaconManager.startMonitoringBeaconsInRegion(mRegion); 101 Log.d("Beacon" , "startMonitoringBeaconsInRegion Success!!"); 102 } catch (RemoteException e) { 103 e.printStackTrace(); 104 Log.d("Beacon" , "Error Occurred"); 105 } 106 } 107 108} 109

build.gradle(Module.app)

apply plugin: 'com.android.application' android { compileSdkVersion 26 defaultConfig { applicationId "com.example.test.beaconread" minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { repositories { //追加 jcenter() } implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' compile 'com.android.support:support-annotations:27.1.1' // 追加 compile 'org.altbeacon:android-beacon-library:2+' }

AndroidManifest.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.test.beaconread"> 4 5 <uses-permission android:name="android.permission.BLUETOOTH"/> 6 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 7 <!--対応していない機種にインストールされないようにuser-futureを設定する--> 8 <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> 9 <!--Android 6.0でBLEを使うのに位置情報のパーミッションが必要--> 10 <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/> 11 12 <application 13 android:allowBackup="true" 14 android:icon="@mipmap/ic_launcher" 15 android:label="@string/app_name" 16 android:roundIcon="@mipmap/ic_launcher_round" 17 android:supportsRtl="true" 18 android:theme="@style/AppTheme"> 19 <activity android:name=".MainActivity"> 20 <intent-filter> 21 <action android:name="android.intent.action.MAIN" /> 22 23 <category android:name="android.intent.category.LAUNCHER" /> 24 </intent-filter> 25 </activity> 26 </application> 27 28</manifest>

試したこと

実機(Huawei Honor8 Android Version7.0)でテストしたところ、一部のLogが表示されないように標準で設定されていたため、隠しコマンド(電話帳アプリ経由)で"AP Log"を表示させるようにしました。

その後、アプリを実機で実行し、Logcat内でタグとして設定した文字列"Beacon"を検索した際のLogが以下の様になっています。

05-22 16:04:22.736 27282-27282/? D/Beacon: onCreate Success!! 05-22 16:04:22.740 27282-27282/? I/BeaconManager: BeaconManager started up on pid 27282 named 'com.example.test.beaconread' for application package 'com.example.test.beaconread'. isMainProcess=true 05-22 16:04:22.745 27282-27282/? D/BeaconParser: Parsing beacon layout: m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25 05-22 16:04:22.745 27282-27282/? D/BeaconParser: Parsing beacon layout: m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24 05-22 16:04:22.754 27282-27282/? D/Beacon: onResume Success!! 05-22 16:04:22.783 27282-27282/? I/BeaconService: beaconService version 2.14 is starting up on the main process 05-22 16:04:22.841 27282-27282/? I/BeaconService: binding 05-22 16:04:22.900 27282-27282/? D/Beacon: didDetermineStateForRegion Success!! 05-22 16:04:22.900 27282-27282/? D/Beacon: startMonitoringBeaconsInRegion Success!! 05-22 16:04:22.903 27282-27282/? I/BeaconService: start monitoring received

補足情報

Android Studio 3.0
OS:Android 7.0
実機:Huawei Honor 8

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

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

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

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

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

guest

回答1

0

AltBeaconは使ったことが無いので想像ですが。

ご提示のコードの以下の部分でRegionオブジェクトを生成していますが、

Java

1 public void onBeaconServiceConnect() { 2 final Region mRegion = new Region("ibeacon", null, null, null);

その後のコードで、少なくともiBeaconのUUIDがセットされていないまま使われているように思います。これですとどのiBeaconパケットを監視しているか指定できているはずがないので、したがってリージョン(領域)の監視もできないと思います。その為、RemoteException例外が発生しているのではないでしょうか。(想像です)

参考にされた記事のコードをよく見てみてください。Regionオブジェクトの生成時にIdentifierクラスのUUIDでセットしています。とりあえず適当なUUIDをセットして例外が起きなくなることを確認してみてください。その後、お使いのiBeaconデバイスのUUIDをセットすれば、進展するかと思います。


**追記しました:**2018/05/23 10:36~11:05
問題解決の為の直接の回答ではなく、参考情報です。

手持ちのAndroid端末2台でAltBeaconを使い、確認してみました。コードは質問者さんがご提示のものを極力流用しています。結果としてはAndroid 4.4(KitKat)の端末ではOKで、Android6.0(Mashmallow)の端末ではNGでした。NGの状況も、質問者さんのケースとは違うようです。

現状で言えるのは、質問者さんがお使いのAndroid端末のバージョンやBluetoothのバージョンに影響しているかもしれず、推測するに、正しく動作させるにはコードを修正しないといけないかまたは現状では不可能かもしれない、です。

初心者さんと言うことで敷居が高くなってしまうかとも思いますが、githubのAltBeaconのソースを見ると、原因を理解し、修正することが可能になるかもしれません。
AltBeacon/android-beacon-library

当方の2機種で試した結果を以下の表に示しておきます。

No機種AndroidバージョンBluetoothバージョン結果状況
1業務用Android端末4.4(KitKat)4.0OK動作した。
2LG Nexus 56.0.1(Mashmallow)4.0NGdidEnterRegionが呼ばれない。didDetermineStateForRegionでstatus=0(MonitorNotifier.OUTSIDE)のまま

投稿2018/05/22 09:07

編集2018/05/23 02:05
dodox86

総合スコア9183

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

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

nkymdesu

2018/05/22 09:32

回答ありがとうございます!! ご指摘通り、 public void onBeaconServiceConnect() { Identifier uuid = Identifier.parse("5e818a3a-c6a5-49cd-b252-82e3e624f76b"); final Region mRegion = new Region("ibeacon", uuid, null, null); //略 と、変更してみましたが同様のエラーが出てしまいます。 また、以下サイトの「監視対象。Region」の項目で、AndroidではUUIDはワイルドカード指定が可能とのことで今回のようにUUIDをnullとしてオブジェクトを生成しました。 https://dev.classmethod.jp/smartphone/android-beacon-library-introduction-2/
dodox86

2018/05/22 09:48

ダメでしたか。それは大変失礼しました。Android 7.0 や機種特有の問題もあるでしょうか。 以前にも(違う問題ですが)AltBeaconに関する質問回答がありました。https://teratail.com/questions/101167
dodox86

2018/05/22 10:00

RemoteExceptionが発生するところをtry 〜 catchで包んで、例外の内容をlogcatに出力してみてください。ヒントがあるかもしれません。また、こうすることでunhandledでアプリが強制終了することはなくなります。 try { // Exceptionが起きるところ } catch (RemoteException ex) { Log.e(TAG, "RemoteException: " + ex.getMessage()); }
nkymdesu

2018/05/23 02:41

ありがとうございます! logcatに出力したところおっしゃる通りアプリが強制終了することはなくなりましたが、なぜかエラーが出力されません... 検証までしていただき本当にありがとうございます。 他の方法でのBeaconデータの読み取りを検討したいと思います。
dodox86

2018/05/23 03:07 編集

あれ、エラー表示すらしませんか。それは困りました。(RemoteExceptionのgetMessageで返される文字列が空なのかな?) > 他の方法でのBeaconデータの読み取りを検討したいと思います。 そうですね。AltBeaconは見たところ使えさえすれば便利そうなライブラリなのですが、数年越しのプロジェクトでコード量も多く、Androidの新しいバージョンでトラブルに合うと解決するのに大変かもしれません。nkymdesuさんのケースではBLE/iBeaconの受信自体はAltBeaconと関係なく、問題なさそうなので、他のものを使うかまたは自分に必要な部分だけ造りこむ、と言うのが勉強にもなってよいかも、と思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問