Androidアプリ開発

Android14対応
(非推奨のCriteriaの対応)

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

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

この記事のテーマ


Android14で非推奨になった Criteria に対応する

SwitchBot に防水温湿度計が登場♪ 計測値はおなじみのあのアプリで確認できます。

ポイント

Android アプリで位置情報を扱うときに使用する Criteria クラス。
精度、電力使用量、高度、速度、方位に基づいて、最適な位置プロバイダを選択してくれます。
Android 14 では、
Criteria クラスが非推奨となり、代替クラスもない状況です。
今回は、Android 14 での
Criteria クラスを使用しない実装について、紹介いたします。

Criteria

Criteriaを使用しない実装

Criteria の使用シーンとして、精度が高い位置プロバイダを選択したい場合があります。
Criteria を使用する実装では、Criteria に高精度(ACCURACY_FINE)をセットして、LocationManager を使って位置プロバイダを取得します。
Criteria を使用しない実装では、使用する位置プロバイダを明示的に選択して、Location を取得、判断する必要があります。

This class was deprecated in API level 34.
Criteria based APIs are deprecated because they cannot fully capture the complexity of location providers, and encourage bad development practices. Prefer to explicit select the location provider of interest (LocationManager#FUSED_PROVIDERetc), rather than relying on Criteria.

要約すると、位置プロバイダを完全に把握できないので、対象の位置プロバイダは明示的な選択してください。

Criteriaを使用する実装

サンプルは、高精度の位置プロバイダが位置偽装しているか判定する関数です。
最初に
LocationManager を使用して、GPS と NETWORK の位置プロバイダが有効になっているか確認しています。
次に
Criteria に ACCURACY_FINE をセットし、位置プロバイダを取得します。 
最後に取得した位置プロバイダを使って、
Location を取得し、位置偽装しているか判定しています。
位置偽装の判定は、Android 12 以降で
isFromMockProvider が使用不可のため、isMock を使用しています。

    …
    public boolean isLocationMocked() {
        boolean isMock = false;
        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            try {
                String provider = locationManager.getBestProvider(criteria, true);
                Location location = locationManager.getLastKnownLocation(provider);
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
                    // Android11以前
                    isMock = location != null && location.isFromMockProvider();
                } else {
                    // Android12以降
                    isMock = location != null && location.isMock();
                }
            } catch (SecurityException e) {
                e.printStackTrace();
            }
        }
        return isMock;
    }
    …

Criteriaを使用しない実装

Criteria を使用しない実装では、最初に使用する位置プロバイダとして、GPS と NETWORK を配列にセットしています。
次に配列のセットした位置プロバイダを使って、
Location を取得し、順に位置偽装しているか判定しています。
つまり、GPS と NETWORK の両方で位置偽装しているか判定しています。

    …
    public boolean isLocationMocked() {
        String[] providers = new String[]{LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER};
        boolean isMock = false;
        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            try {
                for (String provider : providers) {
                    Location location = locationManager.getLastKnownLocation(provider);
                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
                        // Android11以前
                        isMock = location != null && location.isFromMockProvider();
                    } else {
                        // Android12以降
                        isMock = location != null && location.isMock();
                    }
                    if (isMock) break;
                }
            } catch (SecurityException e) {
                e.printStackTrace();
            }
        }
        return isMock;
    }
    …

今回は、ここまでです。

非推奨のCriteriaに対応している Androidアプリです。
内蔵GPSではなく、GPSロガーを使用しているかの判断で使用しています。

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

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

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

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

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

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

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

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

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

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