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

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

ただいまの
回答率

89.99%

AndroidStudioによるビーコンのUnityPlugin作成について

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,250

tanamochi

score 81

いつもお世話になっております。
毎度恐縮ですが質問させていただきます。

前提・実現したいこと

altbeaconを使ってビーコンの検出をするアプリをAndroidStudioで作成したのですがこれをUnityのプラグインに変換しUnityから呼べるようにしたいです。
ひとまず起動時にToastを行うテストをしています。

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

ビルド後アプリが2つ生成されUnityの画面が表示
タスクキルをした後に片方のアプリを起動するとToastの表示がされる真っ黒な画面が表示
設定/アプリ からリストを見るとアプリ自体は一つとして認識されている

該当のソースコード

NativeBLE.java

package com.example.ble;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

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

import java.util.Collection;


public class NativeBLE extends UnityPlayerActivity implements BeaconConsumer {
    // BeaconConsumerインターフェースを実装
    private static String TAG = "AltBeacon Sample";
    // BeaconManagerクラスの変数を定義
    private BeaconManager beaconManager;

    // iBeaconのデータを認識するためのParserフォーマット
    public static final String IBEACON_FORMAT = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24";

    private String mUUID = "";

    // defined somewhere
    private int number = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();

        // staticメソッドでBeaconManagerクラスのインスタンスを取得
        beaconManager = BeaconManager.getInstanceForApplication(this);
        // BeaconParseをBeaconManagerに設定
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(IBEACON_FORMAT));

        final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
        final BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
        if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
            Log.e("BLE_TEST", "No available Bluetooth adapter.");
        }
    }

    @Override
    public void onBeaconServiceConnect() {
        // BeaconManagerクラスのモニタリング設定
        beaconManager.addMonitorNotifier(new MonitorNotifier() {
            @Override
            public void didEnterRegion(Region region) {
                // 領域侵入時に実行
                Log.d(TAG, "didEnterRegion");
                addNotification("beacon", "発見しました");

                try {
                    // レンジングの開始
                    beaconManager.startRangingBeaconsInRegion(new Region("ycBEACON", null, null, null));
                } catch (RemoteException e) {
                    // 例外が発生した場合
                    e.printStackTrace();
                }
            }

            @Override
            public void didExitRegion(Region region) {
                // 領域退出時に実行
                Log.d(TAG, "didExitRegion");
                addNotification("beacon", "見失いました");

                try {
                    // レンジングの停止
                    beaconManager.stopRangingBeaconsInRegion(new Region("ycBEACON", null, null, null));
                } catch (RemoteException e) {
                    // 例外が発生した場合
                    e.printStackTrace();
                }
            }

            @Override
            public void didDetermineStateForRegion(int i, Region region) {

            }
        });

        // BeaconManagerクラスのレンジング設定
        beaconManager.addRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                // 検出したビーコンの情報を全部Logに書き出す
                for (Beacon beacon : beacons) {
                    Log.d(TAG, "UUID:" + beacon.getId1() + ", major:" + beacon.getId2() + ", minor:" + beacon.getId3() + ", Distance:" + beacon.getDistance() + ",RSSI" + beacon.getRssi() + ", TxPower" + beacon.getTxPower());
                    mUUID = beacon.getBluetoothAddress();
                }
            }
        });

        try {
            // モニタリングの開始
            beaconManager.startMonitoringBeaconsInRegion(new Region("ycBEACON", null, null, null));
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
//        beaconManager.unbind(this);
        Log.d(TAG, "background");
    }

    @Override
    protected void onResume() {
        super.onPause();
        beaconManager.bind(this);
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    public void addNotification(String title, String msg){
        // notification
        NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

        Notification n = new Notification.Builder(NativeBLE.this)
                .setContentTitle(title)
                .setContentText(msg)
                .setSmallIcon(R.drawable.test)
                .build();

        nm.notify(number, n);
        ++number;
    }

gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    testCompile 'junit:junit:4.12'
    compile 'org.altbeacon:android-beacon-library:2.9'
}

android.libraryVariants.all{ variant->
    variant.outputs.each{output->
        output.packageLibrary.exclude('libs/classes.jar')
    }
}

task copyLibs(type: Copy) {
    from configurations.compile
    into 'build/outputs/aar'
    exclude { details -> details.file.name.endsWith(".jar") }
}

AndroidManifest.xml(Unity,Androidともに同じ内容)

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.ble">

    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <application android:allowBackup="true" android:label="@string/app_name"
        android:supportsRtl="true">
        <activity android:name=".NativeBLE"
            android:label="@string/app_name"
            android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Unityには記載なし

試したこと

  1. AnddroidStudioの右ペインより
    gradle/Tasks/build/assembleからaarファイルを作成
    gradle/other/copylibsから依存関係のaarファイルを作成

  2. UnityのPlugin/Androidフォルダに上記aarファイル、およびAndroidManifestを配置

  3. Unityビルドを行い実機確認

補足情報(言語/FW/ツール等のバージョンなど)

AndroidStudio2.2.3
Unity5.3.5f1

宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

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