Androidアプリ開発

仮想デバイスか判定する

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

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

この記事のテーマ


実行しているデバイスが仮想デバイスか判定する

ポイント

Android Studioでは、仮想デバイス(Android Virtual Device)を作成して、開発中のアプリをテストができます。
しかし、仮想デバイスで動作させるとExceptionが発生してアプリが終了することがあります。
例えば、仮想デバイスで開発者向けオプションの画面表示などです(Android Studio Koala 2024.1.1で確認)
今回は、実行しているデバイスが仮想デバイスか判定する方法を紹介します。

Android Virtual Device(AVD)

仮想デバイス判定

システム情報(Build)に仮想デバイス特有のパターンであるか判定することで、仮想デバイスを判定します。

    private static final boolean        DEBUG = false;
    private static final String         TAG = MlsUtilities.class.getSimpleName();
    :
    // 開発者向けオプション判定 //
    public static boolean isDevelopmentSettingEnabled(Context context) {
        return Settings.Secure.getInt(context.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) == 1;
    }
    // 仮の現在地情報アプリ判定 //
    public static boolean isMockAppEnabled(String app,Context context) {
        try {
            AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
            return appOpsManager.checkOp(AppOpsManager.OPSTR_MOCK_LOCATION, Process.myUid(), app) == AppOpsManager.MODE_ALLOWED;
        } catch (SecurityException e) {
            return false;
        }
    }
    :
    /** @noinspection BooleanMethodIsAlwaysInverted*/
    // 仮想デバイス判定 //
    public boolean isEmulator() {
        if (DEBUG) {
            String stringBuilder = "FINGERPRINT=" + Build.FINGERPRINT + "\n" +
                    "MODEL=" + Build.MODEL + "\n" +
                    "MANUFACTURER=" + Build.MANUFACTURER + "\n" +
                    "BRAND=" + Build.BRAND + "\n" +
                    "DEVICE=" + Build.DEVICE + "\n" +
                    "PRODUCT=" + Build.PRODUCT + "\n";
            Log.d(TAG, stringBuilder);
        }
        return Build.FINGERPRINT.startsWith("generic") ||
               Build.FINGERPRINT.startsWith("unknown") ||
               Build.MODEL.contains("google_sdk") ||
               Build.MODEL.contains("Emulator") ||
               Build.MODEL.contains("Android SDK built for x86") ||
               Build.MODEL.contains("sdk_phone_armv7") ||
               Build.MANUFACTURER.contains("Genymotion") ||
               (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) ||
               Objects.equals(Build.PRODUCT, "google_sdk") ||
               Objects.equals(Build.PRODUCT, "sdk_gphone_x86");
    }

Android Studioの仮想デバイスマネージャーでは、Androidスマートフォンやタブレット、WearOS、AndroidTV、AutomotiveOSなど様々な仮想デバイスが作成できます。
これらデバイスによって、システム情報が異なります。
仮想デバイス特有のパターンをログ出力して、判定処理を組み立てます。

FINGERPRINT=google/sdk_gphone_x86/generic_x86:8.0.0/OSR1.170901.043/4456315:user/release-keys
MODEL=Android SDK built for x86
MANUFACTURER=Google
BRAND=google
DEVICE=generic_x86
PRODUCT=sdk_gphone_x86

仮想デバイスか判定する

仮の現在地情報アプリ判定でアプリが仮の現在地情報アプリに設定されているか確認します。
設定されていない場合、実行デバイスが仮想デバイスでない場合のみ、開発者向けオプションの画面を表示します。

        :
        Button connect = findViewById(R.id.connect);
        connect.setOnClickListener(v -> {
            // 開発者向けオプション確認
            if (!isDevelopmentSettingEnabled(context)) {
                if (!isEmulator()) {
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
                    startActivity(intent);
                }
                return;
            }
            // 仮の現在地情報アプリの設定確認
            if (!isMockAppEnabled(context.getPackageName(), context)) {
                if (!isEmulator()) {
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
                return;
            }
       });
       :

今回は、ここまでです。

実行しているデバイスが仮想デバイスか判定しているAndroidアプリです。

プロジェクションタイプのキーボードです♪

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

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

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

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

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

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

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

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

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

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