본문 바로가기

TechLog

안드로이드에서 특정 하드웨어 유무에 상관없이 배포 가능하도록 AndroidManifest.xml 파일 구성하기

안드로이드 앱을 만들어 본 프로그래머라면 물론 알고 있겠지만, 앱에서 특정 하드웨어를 사용하려면 AndroidManifest.xml 파일 내에 그 내용을 미리 선언해야 한다. AndroidManifest.xml에 관련된 가이드를 꼼꼼히 읽어본 사람이라면 실제 앱을 배포하면서도 별로 헷갈릴 일이 없겠지만, 케냘의 경우에는 슥 훑어보고 uses-permission 태그만 사용하면 되는 줄 알았다가 낭패를 겪었다. 좌우지간 가이드는 꼼꼼히 읽어볼 일이다.

카메라 기능을 기준으로 예를 하나 들어보도록 하겠다.
케냘은 어제 BITNA를 새로 배포하면서 AndroidManifest.xml 파일에 다음과 같은 내용을 추가하였다:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.kenial.bitna"
      android:versionName="1.97"
      android:versionCode="10">
... 
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
...
 
카메라의 플래시라이트를 사용하는 기능이 추가되었기 때문에 위와 같은 내용을 추가했는데, 문제는 저런 식으로 uses-permission만을 추가해 버리면 실제 마켓에 앱이 배포되었을 때 하드웨어 기능을 기준으로 필터링이 걸리게 된다.저 설정대로 배포해버리면, 카메라나 플래시라이트가 없는 안드로이드 기기는 BITNA 앱을 설치조차 할 수도 없게 되는 것이다. 마켓에서 해당 앱이 검색되지 않게 되거나, 검색이 되더라도 "Your device isn't compatible with this item"같은 메시지가 나타나면서 설치할 수 없게 될 수도 있다. 물론 그렇다고 uses-permission을 빼 버릴 수도 없다. 카메라를 사용하는 순간에 카메라에 대한 접근 권한이 없다면서(실제로는 "알 수 없는 오류"라고 표시되겠지만) 앱이 다운되어 버릴테니까.

그럼 어떻게 하느냐?
이런 상황에는 uses-feature 설정을 같이 추가해야 한다. AndroidManifest.xml 파일을 다음과 같이 수정하면 된다:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.kenial.bitna"
      android:versionName="1.97"
      android:versionCode="10">
    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="11"/>
...
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-feature android:name="android.hardware.camera" android:required="false" />
    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
    <uses-feature android:name="android.hardware.camera.flash" android:required="false" />
    <uses-feature android:name="android.hardware.camera.front" android:required="false" />
... 

위와 같이 uses-feature 설정을 추가하면서 android:required="false" 속성을 주면, 해당 하드웨어에 대한 권한을 요청하지만 하드웨어 기능이 실제 기기에 존재하지 않더라도 설치는 가능하게 된다. 그런 다음에는, 실제 코드에서 카메라의 존재 여부에 따라서 동작하는 코드를 만들면 된다. 카메라가 없는 안드로이드 기기에서 카메라 기능을 사용하면 ... 당연하지만 프로그램이 뻗는다. (참고로 autofocus, flash, front 등은 혹시 몰라서 카메라와 관련된 모든 uses-feature 설정을 추가한 것이다) 

여기서는 카메라를 예로 들었지만, 블루투스나 무선랜, 외장 메모리 등에도 적용되므로 다른 하드웨어에 관련된 부분은 아래 가이드라인에서 확인하도록 하자.


- 참고 : Android Developers: The AndroidManifest.xml File
http://developer.android.com/guide/topics/manifest/manifest-intro.html