使用 <uses-feature> 的注意事項

<uses-feature> 最早是在 Android 1.6 SDK (API Level 4) 中出現的,他的用途是用來宣告 App 會使用到哪些軟硬體功能(比如 Camera、Bluetooth、OpenGL ES version...)。不過事實上系統本身並不會去檢查這些設定,但 Google Play 確會用這些設定去過濾要呈現哪些 App 給使用者。

比如說我宣告了下面這行,表示我會使用到 Camera 功能。這樣 Google Play 就不會將我的 App 顯示在沒有 Camera 的裝置上。
<uses-feature android:name="android.hardware.camera" />
不過後來在 Android 2.0 SDK (API Level 5) 中,<uses-feature> 多了一個屬性叫 android:required。當某功能在 App 中是必要時需設定為 true,若是非必要時則設成 false。咦?...若是不需要的話,我直接省略 <uses-feature> 不是更省事嗎?

在看完落落長的 開發者文件 後才瞭解,嚴格來說,每個 App 都應該要清楚宣告哪些功能是必要或非必要。但因為種種原因,開發者可能忽略或未正確宣告。所以 Google Play 除了檢查 <uses-feature> 外,還會參考 <uses-permission> 的設定。當有設定 <uses-permission> 時, Google Play 會假定相關的功能是必要的,並加入過濾。

舉例來說,我的 App 會使用到 Camera,但不是必要的。而我只宣告了 Camera 的 <uses-permission>,卻忽略了 <uses-feature>。
<uses-permission android:name="android.permission.CAMERA" />
此時 Google Play 發現了這個 <uses-permission>,便會將 Camera 視為必要而進行過濾,沒有 Camera 的裝置就看不到我的 App 了,這樣跟我想要的結果不同。

該怎麼改善呢? 只要加上 Camera 的 <uses-feature>,並把 android:required 設成 false 即可。這樣 Google Play 就不會進行 Camera 的過濾。( <uses-feature> 的優先程度高於 <uses-permission> )
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
這麼一來,我的 App 既取得了 Camera 權限,而且在沒有 Camera 的裝置上也不會被過濾掉。

這個網誌中的熱門文章

Android Studio 如何調整字型大小

App 在 Google Play 被停權與恢復的經驗分享

Android Studio 無法在實機上 Run/Debug 程式?