UnityにはNative Code PluginsというUnity以外で作成されたコードをUnity プラグインの形で含めることができる機能があります。そのNative Code PluginsでAndroidのバッテリ情報を取得してみます。(iOS版はこちらをご覧ください)
jarファイルを作る方法もあるみたいなんですが『AndroidStudioを使ってUnityとAndroidの連携』を参考にしてAndroid Studioでaarファイルを作ってUnityと連携してみました。
Android Studioで作成したソースをGit(mizutanikirin/UnityAndroidBattery)にアップしているので参考にしてみてください。
1.Android Studioでプロジェクト新規作成
1.1. Android Studioを起動して[Start a new Android Studio project]を選択
1.2. プロジェクトの設定
『Configure your new project』でApplication nameなどを設定する。
『Target Android Devices』でUnityプロジェクトのAndroidバージョン( UnityのFile>Build Settings...>Player Settings...>Other Settings>Minimum API Level )と同じバージョンにする。
『Add an activity to Mobile』でAdd No Activeityを選択する。
2.Android Studioでモジュール新規作成
1で空のプロジェクトが作成できたので次にモジュールを作っていきます。
2.1. 新規モジュール作成
File > New > New Module... で新規にモジュール作成をします。
2.2. モジュールの設定
『New Module』でAndroid Libraryを選択します。
『Android Library』でApplication/Library nameなどを設定します。
1 2 3 |
Application/Library name: Lib Module name: lib Package name: net.mizutanikirin.battery.lib |
[Finish]を押すとこういった感じになっているはずです。
3.モジュールの初期設定
3.1. Unityのclasses.jarをモジュールに組み込む
Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Development/Classes/classes.jar を ~/Battery/lib/libs/ にコピーします。
3.2. Gradleの設定
Gradle Scriptのbuild.gradle (Module:lib)に以下を追加します。
1 2 3 4 5 |
android.libraryVariants.all { variant -> variant.outputs.each { output -> output.packageLibrary.exclude('libs/classes.jar') } } |
追加すると以下のようになっています。
4.Classファイルの新規作成
いよいよ本体のClassファイルを作っていきます。
4.1. 新規Class作成
Project > lib > java > net.mizutanikirin.battery.lib を選択した状態で File > New > Java Class で新規Classファイルを作成します。
Class nameはGetBatteryにしました。
作成するとProjectは以下のようになっているはずです。
5.バッテリ情報の取得コード作成
充電ステータスを取得する BatteryState() とバッテリ残量を取得する BatteryLevel() を static にして作成しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
package net.mizutanikirin.battery.lib; import android.content.Context; import android.content.Intent; import android.os.BatteryManager; import android.app.Activity; import android.content.IntentFilter; import com.unity3d.player.UnityPlayer; public class GetBattery { public static int BatteryState(){ final Activity activity = UnityPlayer.currentActivity; final Context context = activity.getApplicationContext(); IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); int nowState = -1; switch (status) { case BatteryManager.BATTERY_STATUS_FULL: // Full nowState = 2; break; case BatteryManager.BATTERY_STATUS_CHARGING: // Charging nowState = 1; break; case BatteryManager.BATTERY_STATUS_DISCHARGING: // Unplugged nowState = 0; break; case BatteryManager.BATTERY_STATUS_NOT_CHARGING: // Unplugged nowState = 0; break; case BatteryManager.BATTERY_STATUS_UNKNOWN: // Unknown nowState = -1; break; } return nowState; } public static int BatteryLevel(){ final Activity activity = UnityPlayer.currentActivity; final Context context = activity.getApplicationContext(); IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = context.registerReceiver(null, ifilter); int nowLevel = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); return nowLevel; } } |
参考:電池の状態を取得する
参考:電池残量と充電状態の監視
6.aarファイル作成
Android StudioのTerminalウィンドウで以下コマンドを実行します。
1 |
./gradlew assembleRelease |
そうすると ~/Battery/lib/build/outputs/aar/ に lib-release.aar ができます。
7.Unityプロジェクトにaarファイルを組み込む
6で作成したaarファイルを適当な名前にリネーム battery-lib.aar してUnityのプロジェクトフォルダの Assets/Plugins/Android/ に入れます。
8.Unityからバッテリ情報取得
BatteryScript.cs を作成して適当なGameObjectに[Add Component]してみてください。コードは以下になり、 AndroidJavaObject.CallStatic<...>("関数名") でJavaのstatic関数を読み込むことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using UnityEngine; using System.Collections; public class BatteryScript : MonoBehaviour { private AndroidJavaObject androidJavaObject = null; private int batteryLevel; private int batteryState; // Use this for initialization void Start () { androidJavaObject = new AndroidJavaObject( "net.mizutanikirin.battery.lib.GetBattery" ); batteryState = androidJavaObject.CallStatic<int>("BatteryState"); batteryLevel = androidJavaObject.CallStatic<int> ("BatteryLevel"); Debug.Log ("batteryState: " + batteryState); Debug.Log ("batteryLevel: " + batteryLevel); } // Update is called once per frame void Update () { } } |
Unityエディタ上では実行できないのでこれをAndroid端末にインストールします。長くなりましたが以上でバッテリ情報取得ができているはずです。
匿名
大変役に立ちました。
ありがとうございます。