概要
UnityでビルドしたAndroidアプリで、SSIDを取得する。
端末が受信したSSID一覧を取得する。
環境
Unity | 5.6.0f3 on macOS |
---|---|
AndroidStudio | 2.3.1 |
実機端末 | VAIO PHONE Android6.0.1 |
作業
1:UnityにAndroid用プラグインを追加
参考:http://indie-du.com/entry/2016/07/14/200000
上記を参考に、アラートが出るのを確認する。
僕は、Log.dで確認しました
2:Javaのソースを改造する
*参考サイトとは、パッケージ名、クラス名が違うので、注意。
SSIDManager.java
package com.exsample.android.mock.sakuma.myssid;
import android.content.Context;
import android.util.Log;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import java.util.List;
public class SSIDManager {
static public void getSSID(Context context){
Log.d("testLog:","aaaa");
final WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (manager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) {
manager.startScan();
List<ScanResult> results = manager.getScanResults();
Log.d("testLog:","bbbb" + results.size());
final String[] items = new String[results.size()];
for (int i=0;i<results.size();++i) {
items[i] = results.get(i).SSID;
Log.d("testLog:", items[i]);
}
}
Log.d("testLog:","cccc");
}
}
3:パーミッション追加
SSID取得するために、パーミッション追加
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
4:ライブラリ作成し、Unityにインポート
1の参考サイトどおりに、aarファイルを作成し、
Unityにインポート
5:Unity呼び出し元を修正
SceneManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
public class SceneManager : MonoBehaviour {
// Use this for initialization
void Start () {
#if UNITY_ANDROID
AndroidJavaClass ssidManager = new AndroidJavaClass ("com.exsample.android.mock.sakuma.myssid.SSIDManager");
// Context(Activity)オブジェクトを取得する
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
context.Call ("runOnUiThread", new AndroidJavaRunnable(() => {
// staticメソッドを呼び出す
ssidManager.CallStatic (
"getSSID",
context
);
}));
#endif
}
// Update is called once per frame
void Update () {
}
}
6:ビルドして終わり
端末で実行
ログにSSIDが出力されるはず
補足
Android6からACCESS_FINE_LOCATIONのパーミッションがないと
SSID取得できないっぽい。