【问题标题】:Detect Android application installed in real devices?检测安装在真实设备中的 Android 应用程序?
【发布时间】:2019-05-17 18:40:45
【问题描述】:

我想检测我的应用程序是安装在真实设备还是模拟器中? 怎么能检测到这个? 我已经通过以下链接 https://github.com/gingo/android-emulator-detector/tree/master/EmulatorDetectorProject

在上述条件下,很少有模拟器返回 true,而返回 false 的模拟器很少(Memu https://www.memuplay.com/)。

能否请任何人建议我如何检测设备是模拟器还是设备?

注意:应用程序应该可以在没有 SIM 卡的平板电脑上运行。 提前致谢。

【问题讨论】:

    标签: android android-emulator


    【解决方案1】:

    我使用下面的代码,从同一个问题中得到它(https://stackoverflow.com/a/32732674/7143587)。您还可以编写方法来检测其他模拟器。希望对您有所帮助!

    public boolean isGenymotionEmulator(String buildManufacturer) {
            return buildManufacturer != null && 
                   (buildManufacturer.contains("Genymotion") || buildManufacturer.equals("unknown"));
        }
    
        public boolean buildModelContainsEmulatorHints(String buildModel) {
            return buildModel.startsWith("sdk")
                    || "google_sdk".equals(buildModel)
                    || buildModel.contains("Emulator")
                    || buildModel.contains("Android SDK");
        }
    

    【讨论】:

      【解决方案2】:

      我想您需要确定设备是否已植根:

      /** @author Kevin Kowalewski */
      public class RootUtil {
          public static boolean isDeviceRooted() {
              return checkRootMethod1() || checkRootMethod2() || checkRootMethod3();
          }
      
          private static boolean checkRootMethod1() {
              String buildTags = android.os.Build.TAGS;
              return buildTags != null && buildTags.contains("test-keys");
          }
      
          private static boolean checkRootMethod2() {
              String[] paths = { "/system/app/Superuser.apk", "/sbin/su", "/system/bin/su", "/system/xbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su",
                      "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su"};
              for (String path : paths) {
                  if (new File(path).exists()) return true;
              }
              return false;
          }
      
          private static boolean checkRootMethod3() {
              Process process = null;
              try {
                  process = Runtime.getRuntime().exec(new String[] { "/system/xbin/which", "su" });
                  BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
                  if (in.readLine() != null) return true;
                  return false;
              } catch (Throwable t) {
                  return false;
              } finally {
                  if (process != null) process.destroy();
              }
          }
      }
      

      使用“su”命令可能不是一个好方法,正如您在此页面中看到的那样:

      Determine if running on a rooted device

      【讨论】:

        【解决方案3】:

        试试这个代码。这对我有用

        public static boolean isEmulator() {
            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.MANUFACTURER.contains("Genymotion")
                    || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
                    || "google_sdk".equals(Build.PRODUCT);
        }
        

        【讨论】:

        • 我也厌倦了这个,但是当我运行应用程序 n Blue-stack emulator 时,它返回 false
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-30
        • 2017-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多