2022년 10월 10일 월요일

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

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

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>
  1. 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:

댓글 쓰기