AndroidStudioにて、こんな警告に遭遇
▼ こういう警告が出ていた
1 |
w: C:\Users\hogehoge\AndroidStudioProjects\Example\app\src\main\java\com\hoge\example\MainActivity.kt: (153, 42): 'getter for defaultDisplay: Display!' is deprecated. Deprecated in Java |
「'getter for defaultDisplay: Display!' is deprecated」
画面の幅と高さを取得するコードで発生しました。
別にエラーじゃなくて警告だから無視してもOKなんですが…API的に非推奨なのを使うのは気持ち悪いので、修正を試すことにしました。
その忘備録として残しておきます。
このページの目次
キッカケはSurfaceViewについてググってた時
SurfaceViewで次のことを実現したかったです。
- 動画をSurfaceViewに直接描画する
- その幅・高さを画面に合わせたい
そしてググってると良さげな記事を見つけました。
▼ StackOverflowのこの回答
Hello try with below code:
123456789101112131415161718192021222324 private void setVideoSize() {// // Get the dimensions of the videoint videoWidth = mediaPlayer.getVideoWidth();int videoHeight = mediaPlayer.getVideoHeight();float videoProportion = (float) videoWidth / (float) videoHeight;// Get the width of the screenint screenWidth = getWindowManager().getDefaultDisplay().getWidth();int screenHeight = getWindowManager().getDefaultDisplay().getHeight();float screenProportion = (float) screenWidth / (float) screenHeight;// Get the SurfaceView layout parametersandroid.view.ViewGroup.LayoutParams lp = surfaceView.getLayoutParams();if (videoProportion > screenProportion) {lp.width = screenWidth;lp.height = (int) ((float) screenWidth / videoProportion);} else {lp.width = (int) (videoProportion * (float) screenHeight);lp.height = screenHeight;}// Commit the layout parameterssurfaceView.setLayoutParams(lp);}
なるほど。動画アスペクトと画面アスペクトを求めておき、その比率が 動画アスペ > 画面アスペ だったら画面幅いっぱいに表示というコードです。
回答を見つけたので早速試してみました。
冒頭のdefaultDisplay is deprecatedの警告に遭遇
実際にコードを書いてみます。
▼ こんなコード(kotlin)
1 2 |
val screenWidth = windowManager.defaultDisplay.width val screenHeight = windowManager.defaultDisplay.height |
▼ あれ?打消し線が表示されてる……
▼ 警告出力を見みると次のwarningが出てた
1 |
w: C:\Users\hogehoge\AndroidStudioProjects\Example\app\src\main\java\com\hoge\example\MainActivity.kt: (153, 42): 'getter for defaultDisplay: Display!' is deprecated. Deprecated in Java |
こういう経緯で冒頭の警告に出会ったわけです。
警告だから無視してもよかったけど…
解決策はResourcesから画面幅・高さを取得すること
このワーニングは次の方法で解消できます。
- まずデフォルトのDisplayManagerを取得する
- そこからDisplayContextを生成する
- 幅・高さをそのResourcesから取得可能
文字で書くと分かりにくいのでコードで示します。
▼ このようなコードで画面幅・高さを取得
1 2 3 4 5 6 7 8 9 |
/// デフォルトのDisplayManager取得 val displayManager = getSystemService<DisplayManager>() ?.getDisplay(Display.DEFAULT_DISPLAY) /// DisplayManagerからContextを取得 val displayContext = createDisplayContext(displayManager!!) /// 画面幅をピクセルで取得 val screenWidth = displayContext.resources.displayMetrics.widthPixels /// 画面高さをピクセルで取得 val screenHeight = displayContext.resources.displayMetrics.heightPixels |
これで無警告で画面幅・高さが取得できました。
単純に this.resources.displayMetrics.widthPixels からでも取得できるけど、それだと不都合もありえるので回りくどいコードです(間違いがあれば指摘ください)
Androidの警告・非推奨APIの関連記事
最後に関連記事をついでに紹介します。
Android Studioの警告・Androidの非推奨APIの関連…
- 関連記事1
onActivityResultが非推奨に…ActivityResultLauncherへの乗り換え方 :
https://pisuke-code.com/android-onactivityresult-alt/ - 関連記事2
flag_immutable or flag_mutable be specified when creating a pendingintentの対処法 :
https://pisuke-code.com/android-android12-update-error/
以上、defaultdisplay display is deprecated の対処法でした。
エラーではないけど修正するのがベターです。