Cordova 로 안드로이드 앱 작성시 AndroidManifest.xml 수정하기

Cordova로 안드로이드 앱을 작성하기 위해 platform에 android를 추가하면 platforms/android 폴더가 생성됩니다.

SCM으로 소스 관리를 할 때에는 외부에서 Download하는 platforms, plugins 폴더를 굳이 포함시키지 않아도 되는데…
(포함하게 되면 하위에 있는 의존성 엮인 엄청난 파일들이…)

따라서 해당 platforms 하위의 파일을 직접 수정하게 되면 소스 관리가 안되는 문제가…
이런 경우 config.xml을 통해 특정 파일을 수정할 수 있습니다.

<edit-config file="AndroidManifest.xml" target="/manifest/uses-sdk" mode="merge">
    <uses-sdk android:minSdkVersion="16" android:maxSdkVersion="23" />
</edit-config>

위와 같이 config.xml에 적으면 빌드 과정에서 AndroidManifest.xml 파일에서 XPath 경로로 /manifest/uses-sdk 노드를 찾아서 하위 노드에 가 merge됩니다.

참고사항: https://cordova.apache.org/docs/en/latest/plugin_ref/spec.html#edit-config

Unity 에서 장치 ID, MAC 주소 가져오기

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


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


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



  1. Settings.Secure 의 ANDROID_ID

  2. WiFi의 MAC 주소

  3. 전화 모듈의 식별자

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


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

	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 폴더에 있는 파일을 복사해서 사용하시면 됩니다.


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



<uses-permission
android:name="android.permission.READ_PHONE_STATE"
>
</uses-permission>
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE"
>
</uses-permission>