2021년 1월 25일 월요일

[Android] meta-tag 으로 app전역에 필요한 설정변수값을 "values/내거.xml"에서 꺼내쓰기

 value 에있는 값을 불러내기 위해서는 같은 프로젝트(또는 라이브러리) 에서 

String mess = context.getResources().getString(R.string.myname);

처럼 해주면 문자열, 부울린, 정수등의 값을 얻을수 있다. 

내 앱이고 단일 라이브러리앱일때는 그냥 저렇게 하는게 좋다.

그러나 다음 시나리오에서는 어떤가

1.  라이브러리 ( wtflover.aar ) : 라이브러리에서 체크할 라이센스키는 라이브러리설치한(즉 구매한) 사람이 알고 있어야함.

2.  wtflover.aar 을 이용해서 내가 만들앱에서는 라이브러리에서 요구하는 키를 소스에 넣을꺼임.

3. java 소스에 하드코딩했더니, Decompiler로 라이센스키 다 까발려짐.


또한 라이센스키는 app전역에서 불러낼수 있어야 한다. 즉 application 레벨의 변수여야 한다.

이를 위해서 meta-tag라는 기능을 제공한다.

사용법은 다음과 같다.

1. AndroidManifest.xml 

: name  은 다른값들과 구분되도록 패키지이름으로 해준다. value는 직접써도 좋지만, value 밑에 별도의 xml을 만들어서 그곳에 입력된 자료들을 지정하는게 좋다. (@string,@bool, @int등이 있다)
value는 @resource로 하면 resourceID가 반환된다.

<application
...>
<
meta-data android:name="com.example.mytest.metatest" android:value="@string/myname" />
또는
<
meta-data android:name="com.example.mytest.metatest.thisbool" android:value="@resource/myname" />

<
activity android:name=".MainActivity">
<
intent-filter>
<
action android:name="android.intent.action.MAIN" />

<
category android:name="android.intent.category.LAUNCHER" />
</
intent-filter>
</
activity>
</
application>

2. values/my_lisensosos.xml 
메타데이터용의 별도의 xml파일을 만드는 것을 권장한다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="myname">ProximitySensor</string>
    <bool name="mybool">true</bool>    
    <integer name="mysec">12</integer >
</resources>



3. 불러내자

ApplicationInfo ai = null;
try {
ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);

if (ai.metaData.containsKey("com.example.mytest.metatest")) {
boolean mybooldata = ai.metaData.getBoolean("com.example.mytest.metatest", false);
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}

구글도 네이버도 meta-tag쓴단다.

0 comments:

댓글 쓰기