Java
Android

Androidでデバイスがどのハードウェア機能を持っているか確認する

More than 1 year has passed since last update.

こんにちはsekitakaです。

Androidでデバイスがどのハードウェア機能(uses-feature)を持っているかをJavaのコードで確認する方法を紹介します。

調べるコード

このコードをAndroidアプリのActivity内の任意の場所に記述すれば調査することができます。

PackageManager pm = getPackageManager();
FeatureInfo[] featureInfos = pm.getSystemAvailableFeatures();
for(FeatureInfo featureInfo : featureInfos){
    Log.d(TAG,"Available Feature: " + featureInfo.name);
}

今回はAndroid TVがandroid.hardware.screen.PORTRAITを持っているのか調べたかったのですが、結果は以下のようになりました。
android.hardware.screen.PORTRAIT はありませんでした。TVは横置きの端末だからでしょうか。

Available Feature: android.software.leanback_only
Available Feature: android.hardware.usb.accessory
Available Feature: android.software.backup
Available Feature: android.hardware.ethernet
Available Feature: android.software.voice_recognizers
Available Feature: android.software.picture_in_picture
Available Feature: android.hardware.type.television
Available Feature: com.google.android.feature.GOOGLE_BUILD
Available Feature: android.hardware.audio.output
Available Feature: android.software.live_tv
Available Feature: android.software.leanback
Available Feature: com.google.android.tv.installed
Available Feature: android.hardware.screen.landscape
Available Feature: android.software.webview
Available Feature: android.hardware.location.network
Available Feature: com.google.android.feature.GOOGLE_EXPERIENCE
Available Feature: com.google.android.feature.EXCHANGE_6_2
Available Feature: android.hardware.location
Available Feature: null

経緯

今回あるアプリのバージョンアップをしようとapkをアップロードしたところ、「サポートされている端末」の数が少し減少しました。

Activityを縦画面固定で使用するためにandroid:screenOrientation="portrait"を追加したために、AndroidManifest.xmlが<uses-feature android:name="android.hardware.screen.PORTRAIT" android:required="true"/>と解釈されたのが原因でした。

そこで <uses-feature android:name="android.hardware.screen.PORTRAIT" android:required="false"/> にしようと思いましたが、android.hardware.screen.PORTRAIT を持たない端末で起動したらどうなるのか確認したくなりました。

端末とハードウェア機能の一覧があればよかったのですが、ぐぐっても見当たらなかったので、android.hardware.screen.PORTRAITを持たなそうなAndroid TVで動作確認しようと思いましたが、果たして本当にandroid.hardware.screen.PORTRAITを持っていないのか確認したくなり調査を行った次第です。

ちなみにアプリ自体はクラッシュすること無く、Android TV上でPORTRAITモードで開きました。顔を傾ければなんとか使えるということです。