Androidアプリ開発

沈黙の非推奨APIに対応する

この記事は約11分で読めます。
記事内に広告が含まれています。
スポンサーリンク

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


デフォルトのビルドで検出できない非推奨APIに対応する

アロマオイルを焚くとリラックスできます♪

ポイント

新しいAndoird(OS)のバージョンに対応する場合、compileSdkVersionを上げてビルドを行います。
デフォルトのビルドでは、新しいバージョンで非推奨になったAPIがソースに含まれていても検出されません。
非推奨とは将来的に廃止予定、バージョン間で互換性がないなど、対処を推奨することを意味しています。

MediaStore.Images.Media.getBitmap

This method was deprecated in API level 29.
loading of images should be performed through ImageDecoder.createSource(ContentResolver, Uri), which offers modern features like PostProcessor.

非推奨APIのチェック

プロジェクトのbuild.gradleファイルに以下の記述を追加します。
ビルド時に非推奨APIの警告が表示されるようになります。

:
allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile).tap {
            configureEach {
                options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
            }
        }
    }
}
:

非推奨APIの対応

非推奨APIの対応としては、新しいAPI(代替え)が用意されていることがほとんどです。
新しいAPIに置換する、OSバージョンを条件にAPIを切り替えて新しいAPIを使用するようにします。
OSバージョンを条件にAPIを切り替えて新しいAPIを使用する場合、非推奨APIがソースに含まれたままです。
このため、非推奨APIのチェックでは非推奨APIの警告は消えません(笑)

非推奨APIの対応をいくつか紹介します。

ケース① 非推奨API

MediaStore.Images.Media.getBitmapはAndroid10(API level 29)で非推奨になりました。
新しいAPI(ImageDecoder)に置換する必要があります。

    :
    @RequiresApi(api = Build.VERSION_CODES.P)
    private static class CustomOnHeaderDecodedListener implements ImageDecoder.OnHeaderDecodedListener {
        @Override
        public void onHeaderDecoded(@NonNull ImageDecoder imageDecoder, @NonNull ImageDecoder.ImageInfo imageInfo, @NonNull ImageDecoder.Source source) {
            imageDecoder.setMutableRequired(true);
        }
    }
    :
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.getContentResolver(), uri), new CustomOnHeaderDecodedListener());
    } else {
        bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri);
    }
    :

OnHeaderDecodedListenerのカスタムクラスでmutableBitmapを取得します。

ケース② 非推奨API

setSystemUiVisibilityはAndroid11(API level 30)で非推奨になりました。
新しいAPI(WindowInsetsController)に置換する必要があります。

  :
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
        WindowInsetsController windowInsetsController = getWindow().getDecorView().getWindowInsetsController();
        if (windowInsetsController != null) {
             windowInsetsController.hide(WindowInsets.Type.statusBars());
             windowInsetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
        }
    } else {
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }
  :

ステータスバーを非表示にします。

ケース③ 引数が異なる

Android10(API level 29)以上と以下でmoveTaskToFrontの引数が変更になりました。

  :
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.AppTask> appTasks = activityManager.getAppTasks();
    if (!appTasks.isEmpty()) {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
            activityManager.moveTaskToFront(appTasks.get(0).getTaskInfo().taskId, 0);
        } else {
            activityManager.moveTaskToFront(appTasks.get(0).getTaskInfo().id, 0);
        }
    }
  :

待機しているTaskを再開します。

今回は、ここまでです。

デフォルトのビルドで検出できない非推奨APIに対応しているAndroidアプリです。

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちらから、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、Android のアプリ開発ができるようになるには、かなりの時間がかかります。
オンラインスクールでの習得を、強くおススメします。

未経験者からシステムエンジニアを目指すのに最適です。まずは無料相談から♪

未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク

コメント欄

タイトルとURLをコピーしました