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

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

ただいまの
回答率

90.75%

  • Java

    13134questions

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

  • Android

    6220questions

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

  • Android Studio

    3468questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 196

nkymdesu

score 1

 前提・実現したいこと

ここに質問の内容を詳しく書いてください。
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

package com.example.test.beaconread;

import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.Identifier;
import org.altbeacon.beacon.MonitorNotifier;
import org.altbeacon.beacon.RangeNotifier;
import org.altbeacon.beacon.Region;

import java.util.Collection;

public class MainActivity extends AppCompatActivity implements BeaconConsumer {

    //定数
    private static final String IBEACON_FORMAT = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24";

    private BeaconManager beaconManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Beacon", "onCreate Success!!");

        //インスタンス化
        beaconManager = BeaconManager.getInstanceForApplication(this);
        //AltBeaconのParserをiBeaconに設定する
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(IBEACON_FORMAT));

    }

    @Override
    protected void onResume() {
        super.onResume();
        // サービスの開始
        beaconManager.bind(this);
        Log.d("Beacon", "onResume Success!!");
    }

    @Override
    protected void onPause() {
        super.onPause();
        // サービスの停止
        beaconManager.unbind(this);
        Log.d("Beacon", "onPause Success!!");
    }

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

        beaconManager.addMonitorNotifier(new MonitorNotifier() {
            @Override
            public void didEnterRegion(Region region) {
                // 領域侵入
                Log.d("Beacon", "didEnterRegion Success!!");

                //beaconManager.startRangingBeaconsInRegion(mRegion);           //エラー②
            }

            @Override
            public void didExitRegion(Region region) {
                // 領域退出
                Log.d("Beacon", "didExitRegion Success!!");

                //beaconManager.stopRangingBeaconsInRegion(mRegion);           //エラー②
            }

            @Override
            public void didDetermineStateForRegion(int i, Region region) {
                // 領域に対する状態が変化
                Log.d("Beacon", "didDetermineStateForRegion Success!!");
            }

        });

        beaconManager.addRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                Log.d("Beacon" , "addRangeNotifier Success!!");
                // 検出したビーコンの情報を全部Logに書き出す
                for(Beacon beacon : beacons) {
                    // ログの出力
                    Log.d("Beacon", "UUID:" + beacon.getId1() + ", major:" + beacon.getId2()
                            + ", minor:" + beacon.getId3() + ", Distance:" + beacon.getDistance()
                            + ",RSSI" + beacon.getRssi());
                }
            }
        });

        try {
            //ビーコン情報の監視を開始
            beaconManager.startMonitoringBeaconsInRegion(mRegion);
            Log.d("Beacon" , "startMonitoringBeaconsInRegion Success!!");
        } catch (RemoteException e) {
            e.printStackTrace();
            Log.d("Beacon" , "Error Occurred");
        }
    }

}

 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 version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test.beaconread">

    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <!--対応していない機種にインストールされないようにuser-futureを設定する-->
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
    <!--Android 6.0でBLEを使うのに位置情報のパーミッションが必要-->
    <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

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

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

   public void onBeaconServiceConnect() {
        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.0 OK 動作した。
2 LG Nexus 5 6.0.1(Mashmallow) 4.0 NG didEnterRegionが呼ばれない。didDetermineStateForRegionでstatus=0(MonitorNotifier.OUTSIDE)のまま

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/22 18: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/

    キャンセル

  • 2018/05/22 18:48

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

    キャンセル

  • 2018/05/22 19:00

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

    キャンセル

  • 2018/05/23 11:41

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

    キャンセル

  • 2018/05/23 12:06 編集

    あれ、エラー表示すらしませんか。それは困りました。(RemoteExceptionのgetMessageで返される文字列が空なのかな?)

    > 他の方法でのBeaconデータの読み取りを検討したいと思います。

    そうですね。AltBeaconは見たところ使えさえすれば便利そうなライブラリなのですが、数年越しのプロジェクトでコード量も多く、Androidの新しいバージョンでトラブルに合うと解決するのに大変かもしれません。nkymdesuさんのケースではBLE/iBeaconの受信自体はAltBeaconと関係なく、問題なさそうなので、他のものを使うかまたは自分に必要な部分だけ造りこむ、と言うのが勉強にもなってよいかも、と思いました。

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13134questions

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

  • Android

    6220questions

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

  • Android Studio

    3468questions

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