블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2794)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (11)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

Unity에서 장치의 고유한 식별 번호를 얻고 싶은데...

아이폰으로는 테스트를 못해 봤습니다만... 잘 되지 않을까 싶네요.

안드로이드에서 장치의 식별자로 쓸만한 것이 3개 있는데

  1. Settings.Secure 의 ANDROID_ID
  2. WiFi의 MAC 주소
  3. 전화 모듈의 식별자

입니다.
아래 코드에서는 위 순서대로 가져오기를 시도해서 잘 가져오는 것을 반환하게 했습니다.

당연히... 별다른 이상한 오류 상황이 아니면 ANDROID_ID를 가져 오겠지요?

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
public string GetDeviceID ()
{
    if (Application.platform == RuntimePlatform.Android)
    {
        try
        {
            using (AndroidJavaObject activity = new AndroidJavaClass ("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject> ("currentActivity"))
            {
                // ANDROID_ID
                try
                {
                    using (AndroidJavaObject resolver = activity.Call<AndroidJavaObject> ("getContentResolver"))
                    {
                        using (AndroidJavaObject settingsSecure = new AndroidJavaObject ("android.provider.Settings.Secure"))
                        {
                            string deviceID = settingsSecure.CallStatic<string> ("getString", resolver, settingsSecure.GetStatic<string> ("ANDROID_ID"));
                            if (!string.IsNullOrEmpty (deviceID))
                            {
                                return deviceID;
                            }
                        }
                    }
                }
                catch (System.Exception)
                {
                }
 
                // WiFi MAC
                try
                {
                    using (AndroidJavaObject wifiManager = activity.Call<AndroidJavaObject> ("getSystemService", activity.GetStatic<string>("WIFI_SERVICE")))
                    {
                        string macAddr = wifiManager.Call<AndroidJavaObject> ("getConnectionInfo").Call<string> ("getMacAddress");
                        if (!string.IsNullOrEmpty (macAddr))
                        {
                            return macAddr;
                        }
                    }
                }
                catch (System.Exception)
                {
                }
                 
                // IMEI/MEID code
                try
                {
                    using (AndroidJavaObject telephonyManager = activity.Call<AndroidJavaObject> ("getSystemService", activity.GetStatic<string>("TELEPHONY_SERVICE")))
                    {
                        string imeiCode = telephonyManager.Call<string> ("getDeviceId");
                        if (!string.IsNullOrEmpty (imeiCode))
                        {
                            return imeiCode;
                        }
                    }
                }
                catch (System.Exception)
                {
                }
 
            }
        }
        catch (System.Exception)
        {
        }
    }
    else
    {
        // 이 방법은 안드로이드에서는 안된다. - Unity 4.3.4f1
        try
        {
            var nics = NetworkInterface.GetAllNetworkInterfaces ();
            if (nics.Length > 0)
            {
                return nics[0].GetPhysicalAddress ().ToString ();
            }
        }
        catch (System.Exception)
        {
        }
    }
    return "";
}

WiFi MAC 주소를 가져오려면 ACCESS_WIFI_STATE 권한이 필요합니다.

IMEI code 를 가져오려면 READ_PHONE_STATE 권한이 필요합니다.

그럼 이 권한은 어떻게 설정할까요?
만약 프로젝트 경로 아래에
Assets/Plugins/Android/AndroidManifest.xml 파일이 있다면 해당 파일을 수정하시면 됩니다.
이 파일이 없으시다면
(Unity 설치 경로)/Editor/Data/PlaybackEngines 폴더 밑에 있는
androidplayer 또는 androiddevelopmentplayer 폴더에 있는 파일을 복사해서 사용하시면 됩니다.

아래 내용을 추가하시면 되겠죠?

1
2
3
4
5
6
7
8
<uses-permission
    android:name="android.permission.READ_PHONE_STATE"
    >
</uses-permission>
<uses-permission
    android:name="android.permission.ACCESS_WIFI_STATE"
    >
</uses-permission>



출처 : http://bspfp.pe.kr/536

반응형
Posted by blueasa
, |