AndroidStudioによるビーコンのUnityPlugin作成について
受付中
回答 0
投稿
- 評価
- クリップ 0
- VIEW 1,730
いつもお世話になっております。
毎度恐縮ですが質問させていただきます。
前提・実現したいこと
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には記載なし
試したこと
AnddroidStudioの右ペインより
gradle/Tasks/build/assembleからaarファイルを作成
gradle/other/copylibsから依存関係のaarファイルを作成UnityのPlugin/Androidフォルダに上記aarファイル、およびAndroidManifestを配置
Unityビルドを行い実機確認
補足情報(言語/FW/ツール等のバージョンなど)
AndroidStudio2.2.3
Unity5.3.5f1
宜しくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる