【问题标题】:Xamarin.Android Detect EmulatorXamarin.Android 检测模拟器
【发布时间】:2016-05-17 17:53:41
【问题描述】:

对于 iPhone,我可以通过以下方式检测到应用程序正在模拟器中运行:

var isSumlator = ObjCRuntime.Runtime.Arch == ObjCRuntime.Arch.SIMULATOR;

在 Xamarin.Android 中检测模拟器的最佳等效方法是什么?

【问题讨论】:

    标签: android xamarin xamarin.android


    【解决方案1】:

    使用 Xamarin.Essentials;

    var isSimulator = DeviceInfo.DeviceType == DeviceType.Virtual;

    【讨论】:

    • 好,这就是我喜欢 Xamarin 的原因,这些内置功能可以节省很多时间。
    【解决方案2】:

    这取决于您的目标是仅用于本地调试测试,还是计划将其保留在代码中以在最终用户环境中进行测试。

    由于 Android 的世界相当大,这是一种基于我们在野外所见的不断发展的方法:

    public bool isEmulator(bool LicensedPlayers = false)
    {
        var detect = 0;
        try
        {
            var teleManager = (TelephonyManager)GetSystemService(TelephonyService);
            string networkOperator = "";
            try
            {
                networkOperator = teleManager.NetworkOperator;
                if (LicensedPlayers)
                {
                    if ((teleManager.NetworkOperatorName == "T-Mobile") && 
                        (Build.Radio == "unknown") && 
                        (Build.Serial == "unknown") && 
                        (Build.Manufacturer == "samsung"))
                    {
                        D.WriteLine("BlueStacks (OS-X) Player");
                        detect += 1;
                    }
                }
            }
            catch
            {
                networkOperator = "";
                D.WriteLine("TelephonyService Exceptiion, custom emulator");
                detect += 1;
            }
            if (networkOperator.Contains("Android"))
            {
                D.WriteLine("Google's Android Emulator");
                detect += 1;
            }
        }
        catch
        {
            D.WriteLine("TelephonyService not available, custom emulator");
            detect += 1;
        }
        if (LicensedPlayers)
        {
            if (Build.Display.Contains("andy") || (Build.Hardware.Contains("andy")))
            {
                D.WriteLine("Andy Player");
                detect += 1;
            }
        }
        if (Build.Hardware.Contains("goldfish"))
        {
            D.WriteLine("Goldfish-based Emulator");
            detect += 1;
        }
        if (Build.Display.ToLowerInvariant().Contains("xamarin"))
        {
            D.WriteLine("Xamarin Android Player");
            detect += 1;
        }
        if (Build.Hardware.Contains("vsemu"))
        {
            D.WriteLine("Visual Studio Android Emulator");
            detect += 1;
        }
        if (Build.Host.Contains("genymobile") || (Build.Manufacturer.ToLowerInvariant().Contains("genymotion")))
        {
            D.WriteLine("Genymotion Android Emulator");
            detect += 1;
        }
        if (Build.Hardware.Contains("vbox") && Build.Hardware.Contains("86"))
        {
            D.WriteLine("VirtualBox-based Emulator");
            detect += 1;
        }
        return detect > 0;
    }
    

    更新:修复了多个平台上的 XAP 模拟器检测

    【讨论】:

      【解决方案3】:

      Source

      string fing = Build.Fingerprint;
      bool isEmulator=false;
      
      if (fing != null) {
        isEmulator =  fing.Contains("vbox") || fing.Contains("generic") || fing.Contains("vsemu");
      }
      

      【讨论】:

      • 仅供参考:许多手机(基于中文和基于 CyanogenMod 的版本)的指纹中包含 generic
      猜你喜欢
      • 2015-07-09
      • 1970-01-01
      • 2018-03-09
      • 2017-04-02
      • 2013-05-24
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多