Android Question Recognize BlueStack emulator

Discussion in 'Android Questions' started by marcick, Apr 9, 2019.

  1. marcick

    marcick Well-Known Member Licensed User

    I'm investigating if there is any way to recognize when the app run on Bluestack or other emulator.
    Any info ?
    Thanks
     
  2. jahswani

    jahswani Active Member Licensed User

    Code:
    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);
    }
    Try this code with inline.
    Source
     
  3. marcick

    marcick Well-Known Member Licensed User

    I'm trying to implement this code but get an error, where I'm wrong ?

    Code:
    Sub Process_Globals
        
    Private NativeMe As JavaObject
    End Sub

    Sub Globals
    End Sub

    Sub Activity_Create(FirstTime As Boolean)
        
    Activity.LoadLayout("Layout1")
        
    If FirstTime Then
            NativeMe.InitializeContext
        
    End If
        
    Dim s As Boolean = NativeMe.RunMethod("IsEmulator"Null)
        
    Log(s)
    End Sub

    Sub Activity_Resume
        
        
    End Sub

    Sub Activity_Pause (UserClosed As Boolean)

    End Sub

    #If JAVA
    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);
    }
    #End If
     
  4. DonManfred

    DonManfred Expert Licensed User

    [sarcasm]hiding the full error you got it a good idea.[/sarcasm] Should we guess it?
     
    mangojack likes this.
  5. DonManfred

    DonManfred Expert Licensed User

    The methodname is "isEmulator"!
     
  6. marcick

    marcick Well-Known Member Licensed User

    Right.. sorry ...
    Here it is (nothing changes with isEmulator instead of IsEmulator)

    Code:
    B4A Version: 9.00
    Parsing code.    (
    0.00s)
    Building folders structure.    (
    0.04s)
    Compiling code.    (
    0.11s)
    Compiling layouts code.    (
    0.03s)
    Organizing libraries.    (
    0.00s)
    Generating R 
    file.    (1.75s)
    Compiling debugger engine code.    (
    6.04s)
    Compiling generated Java code.    Error
    B4A line: 
    34
    End Sub
    javac 
    1.8.0_51
    src\b4a\example\main.java:
    420: error: <identifier> expected
    Public static boolean isEmulator() {
          ^
    1 error
     
  7. PassionDEV

    PassionDEV Active Member Licensed User

    you can use this code that i found on this forum, there is also isRunningOnEmulator already implemented inside the java code .

    how ever i am already searching for a solution to detect emulators and this one isn't detect any modern emulator sense theer information are very similar to a real android device

    Code:
    nativeMe.RunMethod("getFingerprint"Null) // to read finger print etc..






    #If Java


    import android.Manifest;
    import android.accounts.Account;
    import android.accounts.AccountManager;
    import android.annotation.TargetApi;
    import android.bluetooth.BluetoothAdapter;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.content.pm.ApplicationInfo;
    import android.content.pm.PackageManager;
    import android.database.Cursor;
    import android.location.Location;
    import android.location.LocationManager;
    import android.media.AudioManager;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.net.Uri;
    import android.net.wifi.WifiManager;
    import android.os.BatteryManager;
    import android.os.Build;
    import android.provider.Settings;
    import android.telephony.TelephonyManager;
    import android.util.DisplayMetrics;
    import android.util.Log;
    import android.view.Display;
    import android.view.MotionEvent;
    import android.view.WindowManager;
    import android.webkit.WebView;
    //import com.google.android.gms.ads.identifier.AdvertisingIdClient;
    //import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
    //import com.google.android.gms.common.GooglePlayServicesRepairableException;
    import java.io.File;
    import java.io.IOException;
    import java.net.Inet4Address;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.util.Collections;
    import java.util.List;
    import java.util.Locale;
    import java.util.UUID;


      //private final Context context;
      private TelephonyManager tm; // = (TelephonyManager) BA.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
      private String initialVal = "";

      public int RINGER_MODE_SILENT = 0;
      public int RINGER_MODE_NORMAL = 1;
      public int RINGER_MODE_VIBRATE = 2;

      /**
       * The constant LOGTAG.
       */
      //private static final String LOGTAG = "EasyDeviceInfo";





      /**
       * Instantiates a new Easy device info.
       *
       * @param context the context
       */
    //  public EasyDeviceInfo(Context context) {
    //    this.context = context;
    //    tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    //    initialVal = "na";
    //  }

      /**
       * Gets library version.
       *
       * @return the library version
       */
    //  public String getLibraryVersion() {
    //    String version = "1.1.9";
    //    int versionCode = 11;
    //    return version + "-" + versionCode;
    //  }

      /**
       * Gets android id.
       *
       * @return the android id
       */
      public String getAndroidID() {
        String result = initialVal;
        try {
          result = Settings.Secure.getString(BA.applicationContext.getContentResolver(), Settings.Secure.ANDROID_ID);
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }
     
     
       /**
       * Gets model.
       *
       * @return the model
       */
      public String getModel() {
        String result = initialVal;
        try {
          result = Build.MODEL;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return handleIllegalCharacterInResult(result);
      }


      /**
       * Gets build brand.
       *
       * @return the build brand
       */
      public String getBuildBrand() {
        String result = initialVal;
        try {
          result = Build.BRAND;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return handleIllegalCharacterInResult(result);
      }

      /**
       * Gets build host.
       *
       * @return the build host
       */
      public String getBuildHost() {
        String result = initialVal;
        try {
          result = Build.HOST;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }

      /**
       * Gets build tags.
       *
       * @return the build tags
       */
      public String getBuildTags() {
        String result = initialVal;
        try {
          result = Build.TAGS;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }
     
     
      /**
       * Gets build time.
       *
       * @return the build time
       */
      public long getBuildTime() {
        long result = 0;
        try {
          result = Build.TIME;
        } catch (Exception e) {
          e.printStackTrace();
        }
        return result;
      } 
     
      /**
       * Gets build user.
       *
       * @return the build user
       */
      public String getBuildUser() {
        String result = initialVal;
        try {
          result = Build.USER;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
      /**
       * Gets build version release.
       *
       * @return the build version release
       */
      public String getBuildVersionRelease() {
        String result = initialVal;
        try {
          result = Build.VERSION.RELEASE;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
        /**
       * Gets screen display id.
       *
       * @return the screen display id
       */
      public String getScreenDisplayID() {
        String result = initialVal;
        try {
          WindowManager wm = (WindowManager) BA.applicationContext.getSystemService(Context.WINDOW_SERVICE);
          Display display = wm.getDefaultDisplay();
          result = String.valueOf(display.getDisplayId());
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
      /**
       * Gets build version codename.
       *
       * @return the build version codename
       */
      public String getBuildVersionCodename() {
        String result = initialVal;
        try {
          result = Build.VERSION.CODENAME;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }
     
      /**
       * Gets build version incremental.
       *
       * @return the build version incremental
       */
      public String getBuildVersionIncremental() {
        String result = initialVal;
        try {
          result = Build.VERSION.INCREMENTAL;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }
     

      /**
       * Gets build version sdk.
       *
       * @return the build version sdk
       */
      public int getBuildVersionSDK() {
        int result = 0;
        try {
          result = Build.VERSION.SDK_INT;
        } catch (Exception e) {
          e.printStackTrace();
        }
        return result;
      }
     

      /**
       * Gets build id.
       *
       * @return the build id
       */
      public String getBuildID() {
        String result = initialVal;
        try {
          result = Build.ID;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
            
      /**
       * Is Device rooted boolean
       *
       * @return the boolean
       */
      public boolean isDeviceRooted() {
        String su = "su";
        String[] locations = {
            "/sbin/", "/system/bin/", "/system/xbin/", "/system/sd/xbin/", "/system/bin/failsafe/",
            "/data/local/xbin/", "/data/local/bin/", "/data/local/"
        };
        for (String location : locations) {
          if (new File(location + su).exists()) {
            return true;
          }
        }
        return false;
      }
     

      /**
       * Get supported abis string [ ].
       *
       * @return the string [ ]
       */
      public String[] getSupportedABIS() {
        String[] result = new String[] { "-" };
        try {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            result = Build.SUPPORTED_ABIS;
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length == 0) {
          result = new String[] { "-" };
        }
        return result;
      }
     


      /**
       * Gets string supported abis.
       *
       * @return the string supported abis
       */
      public String getStringSupportedABIS() {
        String result = initialVal;
        try {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            String[] supportedABIS = Build.SUPPORTED_ABIS;

            StringBuilder supportedABIString = new StringBuilder();
            if (supportedABIS.length > 0) {
              for (String abis : supportedABIS) {
                supportedABIString.append(abis).append("_");
              }
              supportedABIString.deleteCharAt(supportedABIString.lastIndexOf("_"));
            } else {
              supportedABIString.append(initialVal);
            }
            result = supportedABIString.toString();
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return handleIllegalCharacterInResult(result);
      } 
     
     
       /**
       * Gets string supported 32 bit abis.
       *
       * @return the string supported 32 bit abis
       */
      public String getStringSupported32bitABIS() {
        String result = initialVal;
        try {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            String[] supportedABIS = Build.SUPPORTED_32_BIT_ABIS;

            StringBuilder supportedABIString = new StringBuilder();
            if (supportedABIS.length > 0) {
              for (String abis : supportedABIS) {
                supportedABIString.append(abis).append("_");
              }
              supportedABIString.deleteCharAt(supportedABIString.lastIndexOf("_"));
            } else {
              supportedABIString.append(initialVal);
            }

            result = supportedABIString.toString();
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }

        return handleIllegalCharacterInResult(result);
      }
     
     
      /**
       * Gets manufacturer.
       *
       * @return the manufacturer
       */
      public String getManufacturer() {
        String result = initialVal;
        try {
          result = Build.MANUFACTURER;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return handleIllegalCharacterInResult(result);
      } 
     
     
     
       /**
       * Gets resolution.
       *
       * @return the resolution
       */
      public String getResolution() {
        String result = initialVal;
        try {
          WindowManager wm = (WindowManager) BA.applicationContext.getSystemService(Context.WINDOW_SERVICE);

          Display display = wm.getDefaultDisplay();

          DisplayMetrics metrics = new DisplayMetrics();
          display.getMetrics(metrics);
          result = metrics.heightPixels + "x" + metrics.widthPixels;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result.length() == 0) {
          result = initialVal;
        }
        return result;
      }
     

      /**
       * Gets carrier.
       *
       * @return the carrier
       */
      public String getCarrier() {
        String result = initialVal;
        tm = (TelephonyManager) BA.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
        try {
          if (tm != null && tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) {
            result = tm.getNetworkOperatorName().toLowerCase(Locale.getDefault());
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result.length() == 0) {
          result = initialVal;
        }
        return handleIllegalCharacterInResult(result);
      }
     
     
      /**
       * Gets device.
       *
       * @return the device
       */
      public String getDevice() {
        String result = initialVal;
        try {
          result = Build.DEVICE;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
      /**
       * Gets bootloader.
       *
       * @return the bootloader
       */
      public String getBootloader() {
        String result = initialVal;
        try {
          result = Build.BOOTLOADER;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
      /**
       * Gets board.
       *
       * @return the board
       */
      public String getBoard() {
        String result = initialVal;
        try {
          result = Build.BOARD;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
      /**
       * Gets display version.
       *
       * @return the display version
       */
      public String getDisplayVersion() {
        String result = initialVal;
        try {
          result = Build.DISPLAY;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
       /**
       * Gets language.
       *
       * @return the language
       */
      public String getLanguage() {
        String result = initialVal;
        try {
          result = Locale.getDefault().getLanguage();
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }

      /**
       * Gets country.
       *
       * @return the country
       */
      public String getCountry() {
        String result = initialVal;
        tm = (TelephonyManager) BA.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
        try {
          if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
            result = tm.getSimCountryIso().toLowerCase(Locale.getDefault());
          } else {
            Locale locale = Locale.getDefault();
            result = locale.getCountry().toLowerCase(locale);
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result.length() == 0) {
          result = initialVal;
        }
        return handleIllegalCharacterInResult(result);
      }
     
     
     
      /**
       * Gets battery percentage
       *
       * @return the battery percentage
       */
      public int getBatteryPercentage() {
        int percentage = 0;
        Intent batteryStatus = getBatteryStatusIntent();
        if (batteryStatus != null) {
          int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
          int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
          percentage = (int) ((level / (float) scale) * 100);
        }

        return percentage;
      }

      /**
       * Is device charging boolean.
       *
       * @return is battery charging boolean
       */
      public boolean isDeviceCharging() {
        Intent batteryStatus = getBatteryStatusIntent();
        int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        return (status == BatteryManager.BATTERY_STATUS_CHARGING
            || status == BatteryManager.BATTERY_STATUS_FULL);
      }

      /**
       * Is device charging usb boolean.
       *
       * @return is battery charging via USB boolean
       */
      public boolean isDeviceChargingUSB() {
        Intent batteryStatus = getBatteryStatusIntent();
        int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        return (chargePlug == BatteryManager.BATTERY_PLUGGED_USB);
      }

      /**
       * Is device charging ac boolean.
       *
       * @return is battery charging via AC boolean
       */
      public boolean isDeviceChargingAC() {
        Intent batteryStatus = getBatteryStatusIntent();
        int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
        return (chargePlug == BatteryManager.BATTERY_PLUGGED_AC);
      } 
     
     
       /**
       * Gets network type.
       *
       * @return the network type
       */
      public String getNetworkType() {
        int networkStatePermission =
            BA.applicationContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE);

        String result = initialVal;

        if (networkStatePermission == PackageManager.PERMISSION_GRANTED) {
          try {
            ConnectivityManager cm =
                (ConnectivityManager) BA.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            if (activeNetwork == null) {
              result = "Unknown";
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI
                || activeNetwork.getType() == ConnectivityManager.TYPE_WIMAX) {
              result = "Wifi/WifiMax";
            } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
              TelephonyManager manager =
                  (TelephonyManager) BA.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
              if (manager.getSimState() == TelephonyManager.SIM_STATE_READY) {
                switch (manager.getNetworkType()) {

                  // Unknown
                  case TelephonyManager.NETWORK_TYPE_UNKNOWN:
                    result = "Cellular - Unknown";
                    break;
                  // Cellular Data–2G
                  case TelephonyManager.NETWORK_TYPE_EDGE:
                  case TelephonyManager.NETWORK_TYPE_GPRS:
                  case TelephonyManager.NETWORK_TYPE_CDMA:
                  case TelephonyManager.NETWORK_TYPE_IDEN:
                  case TelephonyManager.NETWORK_TYPE_1xRTT:
                    result = "Cellular - 2G";
                    break;
                  // Cellular Data–3G
                  case TelephonyManager.NETWORK_TYPE_UMTS:
                  case TelephonyManager.NETWORK_TYPE_HSDPA:
                  case TelephonyManager.NETWORK_TYPE_HSPA:
                  case TelephonyManager.NETWORK_TYPE_HSPAP:
                  case TelephonyManager.NETWORK_TYPE_HSUPA:
                  case TelephonyManager.NETWORK_TYPE_EVDO_0:
                  case TelephonyManager.NETWORK_TYPE_EVDO_A:
                  case TelephonyManager.NETWORK_TYPE_EVDO_B:
                    result = "Cellular - 3G";
                    break;
                  // Cellular Data–4G
                  case TelephonyManager.NETWORK_TYPE_LTE:
                    result = "Cellular - 4G";
                    break;
                  // Cellular Data–Unknown Generation
                  default:
                    result = "Cellular - Unknown Generation";
                    break;
                }
              }
            }
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
        if (result.length() == 0) {
          result = initialVal;
        }
        return handleIllegalCharacterInResult(result);
      }
     
     
     
      /**
       * Gets os codename.
       *
       * @return the os codename
       */
      public String getOSCodename() {
        String codename = initialVal;
        switch (Build.VERSION.SDK_INT) {
          case Build.VERSION_CODES.BASE:
            codename = "First Android Version. Yay !";
            break;
          case Build.VERSION_CODES.BASE_1_1:
            codename = "Base Android 1.1";
            break;
          case Build.VERSION_CODES.CUPCAKE:
            codename = "Cupcake";
            break;
          case Build.VERSION_CODES.DONUT:
            codename = "Donut";
            break;
          case Build.VERSION_CODES.ECLAIR:
          case Build.VERSION_CODES.ECLAIR_0_1:
          case Build.VERSION_CODES.ECLAIR_MR1:

            codename = "Eclair";
            break;
          case Build.VERSION_CODES.FROYO:
            codename = "Froyo";
            break;
          case Build.VERSION_CODES.GINGERBREAD:
          case Build.VERSION_CODES.GINGERBREAD_MR1:
            codename = "Gingerbread";
            break;
          case Build.VERSION_CODES.HONEYCOMB:
          case Build.VERSION_CODES.HONEYCOMB_MR1:
          case Build.VERSION_CODES.HONEYCOMB_MR2:
            codename = "Honeycomb";
            break;
          case Build.VERSION_CODES.ICE_CREAM_SANDWICH:
          case Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1:
            codename = "Ice Cream Sandwich";
            break;
          case Build.VERSION_CODES.JELLY_BEAN:
          case Build.VERSION_CODES.JELLY_BEAN_MR1:
          case Build.VERSION_CODES.JELLY_BEAN_MR2:
            codename = "Jelly Bean";
            break;
          case Build.VERSION_CODES.KITKAT:
            codename = "Kitkat";
            break;
          case Build.VERSION_CODES.KITKAT_WATCH:
            codename = "Kitkat Watch";
            break;
          case Build.VERSION_CODES.LOLLIPOP:
          case Build.VERSION_CODES.LOLLIPOP_MR1:
            codename = "Lollipop";
            break;
          case Build.VERSION_CODES.M:
            codename = "Marshmallow";
            break;
        }
        return codename;
      } 
     
     
      /**
       * Gets os version.
       *
       * @return the os version
       */
      public String getOSVersion() {
        String result = initialVal;
        try {
          result = Build.VERSION.RELEASE;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 


      /**
       * Gets wifi mac.
       *
       * @return the wifi mac
       */
      @SuppressWarnings("MissingPermission") public String getWifiMAC() {
        String result = initialVal;
        try {

          if (BA.applicationContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_WIFI_STATE)
              == PackageManager.PERMISSION_GRANTED) {

            WifiManager wm = (WifiManager) BA.applicationContext.getSystemService(Context.WIFI_SERVICE);
            result = wm.getConnectionInfo().getMacAddress();
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }
     
     
      /**
       * Gets imei.
       *
       * @return the imei
       */
      public String getIMEI() {
        tm = (TelephonyManager) BA.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
        String result = initialVal;
        boolean hasReadPhoneStatePermission =
            BA.applicationContext.checkCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE)
                == PackageManager.PERMISSION_GRANTED;
        try {
          if (hasReadPhoneStatePermission) result = tm.getDeviceId();
        } catch (Exception e) {
          e.printStackTrace();
        }

        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
      /**
       * Gets imsi.
       *
       * @return the imsi
       */
      public String getIMSI() {
        String result = initialVal;
        tm = (TelephonyManager) BA.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
        boolean hasReadPhoneStatePermission =
            BA.applicationContext.checkCallingOrSelfPermission(Manifest.permission.READ_PHONE_STATE)
                == PackageManager.PERMISSION_GRANTED;
        try {
          if (hasReadPhoneStatePermission) result = tm.getSubscriberId();
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
      /**
       * Gets serial.
       *
       * @return the serial
       */
      public String getSerial() {
        String result = initialVal;
        try {
          result = Build.SERIAL;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }

      /**
       * Gets sim serial.
       *
       * @return the sim serial
       */
      public String getSIMSerial() {
        String result = initialVal;
        tm = (TelephonyManager) BA.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
        try {
          result = tm.getSimSerialNumber();
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
      /**
       * Gets gsfid.
       *
       * @return the gsfid
       */
      public String getGSFID() {
        final Uri URI = Uri.parse("content://com.google.android.gsf.gservices");
        final String ID_KEY = "android_id";

        String[] params = { ID_KEY };
        Cursor c = BA.applicationContext.getContentResolver().query(URI, null, null, params, null);

        if (c == null) {
          return initialVal;
        } else if (!c.moveToFirst() || c.getColumnCount() < 2) {
          c.close();
          return initialVal;
        }

        try {
          String gsfID = Long.toHexString(Long.parseLong(c.getString(1)));
          c.close();
          return gsfID;
        } catch (NumberFormatException e) {
          c.close();
          return initialVal;
        }
      }

      /**
       * Gets bluetooth mac.
       *
       * @return the bluetooth mac
       */
      @SuppressWarnings("MissingPermission") public String getBluetoothMAC() {
        String result = initialVal;
        try {
          if (BA.applicationContext.checkCallingOrSelfPermission(Manifest.permission.BLUETOOTH)
              == PackageManager.PERMISSION_GRANTED) {
            BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter();
            result = bta.getAddress();
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
      /**
       * Gets psuedo unique id.
       *
       * @return the psuedo unique id
       */
      public String getPsuedoUniqueID() {
        // If all else fails, if the user does have lower than API 9 (lower
        // than Gingerbread), has reset their phone or 'Secure.ANDROID_ID'
        // returns 'null', then simply the ID returned will be solely based
        // off their Android device information. This is where the collisions
        // can happen.
        // Try not to use DISPLAY, HOST or ID - these items could change.
        // If there are collisions, there will be overlapping data
        String devIDShort = "35" +
            (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          devIDShort += (Build.SUPPORTED_ABIS[0].length() % 10);
        } else {
          devIDShort += (Build.CPU_ABI.length() % 10);
        }

        devIDShort +=
            (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length()
                % 10) + (Build.PRODUCT.length() % 10);

        // Only devices with API >= 9 have android.os.Build.SERIAL
        // http://developer.android.com/reference/android/os/Build.html#SERIAL
        // If a user upgrades software or roots their phone, there will be a duplicate entry
        String serial;
        try {
          serial = Build.class.getField("SERIAL").get(null).toString();

          // Go ahead and return the serial for api => 9
          return new UUID(devIDShort.hashCode(), serial.hashCode()).toString();
        } catch (Exception e) {
          // String needs to be initialized
          serial = "ESYDV000"; // some value
        }

        // Finally, combine the values we have found by using the UUID class to create a unique identifier
        return new UUID(devIDShort.hashCode(), serial.hashCode()).toString();
      } 
     
     
      /**
       * Gets phone no.
       *
       * @return the phone no
       */
      public String getPhoneNo() {
        String result = initialVal;
        tm = (TelephonyManager) BA.applicationContext.getSystemService(Context.TELEPHONY_SERVICE);
        try {
          if (tm.getLine1Number() != null) {
            result = tm.getLine1Number();
            if (result.equals("")) {
              result = initialVal;
            }
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result.length() == 0) {
          result = initialVal;
        }
        return result;
      }

      /**
       * Gets product.
       *
       * @return the product
       */
      public String getProduct() {
        String result = initialVal;
        try {
          result = Build.PRODUCT;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
      /**
       * Gets fingerprint.
       *
       * @return the fingerprint
       */
      public String getFingerprint() {
        String result = initialVal;
        try {
          result = Build.FINGERPRINT;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }

      /**
       * Gets hardware.
       *
       * @return the hardware
       */
      public String getHardware() {
        String result = initialVal;
        try {
          result = Build.HARDWARE;
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
      /**
       * Gets radio ver.
       *
       * @return the radio ver
       */
      public String getRadioVer() {
        String result = initialVal;
        try {

          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            result = Build.getRadioVersion();
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }

      /**
       * Gets ip address.
       *
       * @param useIPv4 the use i pv 4
       * @return the ip address
       */
      public String getIPAddress(boolean useIPv4) {
        String result = initialVal;
        try {
          List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
          for (NetworkInterface intf : interfaces) {
            List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
            for (InetAddress addr : addrs) {
              if (!addr.isLoopbackAddress()) {
                String sAddr = addr.getHostAddress().toUpperCase();
                boolean isIPv4 = addr instanceof Inet4Address;
                if (useIPv4) {
                  if (isIPv4) result = sAddr;
                } else {
                  if (!isIPv4) {
                    int delim = sAddr.indexOf('%'); // drop ip6 port suffix
                    result = delim < 0 ? sAddr : sAddr.substring(0, delim);
                  }
                }
              }
            }
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
      /**
       * Gets ua.
       *
       * @return the ua
       */
      public String getUA() {
        final String system_ua = System.getProperty("http.agent");
        String result = system_ua;
        try {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            result = new WebView(BA.applicationContext).getSettings().getDefaultUserAgent(BA.applicationContext) +
                "__" + system_ua;
          } else {
            result = new WebView(BA.applicationContext).getSettings().getUserAgentString() +
                "__" + system_ua;
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result.length() < 0 || result == null) {
          result = system_ua;
        }
        return result;
      }

      /**
       * Get lat long double [ ].
       *
       * @return the double [ ]
       */
      @SuppressWarnings("MissingPermission") @TargetApi(Build.VERSION_CODES.M)
      public double[] getLatLong() {
        boolean hasFineLocationPermission =
            BA.applicationContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED ? true : false;
        boolean isGPSEnabled, isNetworkEnabled;

        double[] gps = new double[2];
        gps[0] = 0;
        gps[1] = 0;
        if (hasFineLocationPermission) {
          try {
            LocationManager lm = (LocationManager) BA.applicationContext.getSystemService(Context.LOCATION_SERVICE);

            isGPSEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
            isNetworkEnabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            Location net_loc = null, gps_loc = null, final_loc = null;

            if (isGPSEnabled) {
              gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            }
            if (isNetworkEnabled) {
              net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            }

            if (gps_loc != null && net_loc != null) {
              if (gps_loc.getAccuracy() >= net_loc.getAccuracy()) {
                final_loc = gps_loc;
              } else {
                final_loc = net_loc;
              }
            } else {
              if (gps_loc != null) {
                final_loc = gps_loc;
              } else if (net_loc != null) {
                final_loc = net_loc;
              } else {
                // GPS and Network both are null so try passive
                final_loc = lm.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
              }
            }

            if (final_loc != null) {
              gps[0] = final_loc.getLatitude();
              gps[1] = final_loc.getLongitude();
            }

            return gps;
          } catch (Exception e) {
            e.printStackTrace();
          }
        }
        return gps;
      } 
     
     
      /**
       * Gets time.
       *
       * @return the time
       */
      public long getTime() {
        return System.currentTimeMillis();
      }

      /**
       * Gets formatted time.
       *
       * @return the formatted time
       */
      public String getFormatedTime() {

        long millis = System.currentTimeMillis();
        int sec = (int) (millis / 1000) % 60;
        int min = (int) ((millis / (1000 * 60)) % 60);
        int hr = (int) ((millis / (1000 * 60 * 60)) % 24);

        return String.format("%02d:%02d:%02d", hr, min, sec);
      } 
     
     
      /**
       * Gets app name.
       *
       * @return the app name
       */
      public String getAppName() {
        String result;
        final PackageManager pm = BA.applicationContext.getPackageManager();
        ApplicationInfo ai;
        try {
          ai = pm.getApplicationInfo(BA.applicationContext.getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
          ai = null;
          e.printStackTrace();
        }
        result = (String) (ai != null ? pm.getApplicationLabel(ai) : initialVal);
        return result;
      }

      /**
       * Gets app version.
       *
       * @return the app version
       */
      public String getAppVersion() {
        String result = initialVal;
        try {
          result = BA.applicationContext.getPackageManager().getPackageInfo(BA.applicationContext.getPackageName(), 0).versionName;
        } catch (PackageManager.NameNotFoundException e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
      /**
       * Gets app version code.
       *
       * @return the app version code
       */
      public String getAppVersionCode() {
        String result = initialVal;
        try {
          result = String.valueOf(
              BA.applicationContext.getPackageManager().getPackageInfo(BA.applicationContext.getPackageName(), 0).versionCode);
        } catch (PackageManager.NameNotFoundException e) {
          e.printStackTrace();
        }
        if (result.length() == 0) {
          result = initialVal;
        }
        return result;
      }

      /**
       * Gets activity name.
       *
       * @return the activity name
       */
      public String getActivityName() {
        String result = initialVal;
        try {
          result = BA.applicationContext.getClass().getSimpleName();
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result.length() == 0) {
          result = initialVal;
        }
        return result;
      } 
     
     
       /**
       * Gets package name.
       *
       * @return the package name
       */
      public String getPackageName() {
        String result = initialVal;
        try {
          result = BA.applicationContext.getPackageName();
        } catch (Exception e) {
          e.printStackTrace();
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }

      /**
       * Gets store.
       *
       * @return the store
       */
      public String getStore() {
        String result = initialVal;
        if (Build.VERSION.SDK_INT >= 3) {
          try {
            result = BA.applicationContext.getPackageManager().getInstallerPackageName(BA.applicationContext.getPackageName());
          } catch (Exception e) {
            //Log.i(LOGTAG, "Can't get Installer package");
          }
        }
        if (result == null || result.length() == 0) {
          result = initialVal;
        }
        return result;
      }
     
      /**
       * Gets density.
       *
       * @return the density
       */
      public String getDensity() {
        String densityStr = initialVal;
        final int density = BA.applicationContext.getResources().getDisplayMetrics().densityDpi;
        switch (density) {
          case DisplayMetrics.DENSITY_LOW:
            densityStr = "LDPI";
            break;
          case DisplayMetrics.DENSITY_MEDIUM:
            densityStr = "MDPI";
            break;
          case DisplayMetrics.DENSITY_TV:
            densityStr = "TVDPI";
            break;
          case DisplayMetrics.DENSITY_HIGH:
            densityStr = "HDPI";
            break;
          case DisplayMetrics.DENSITY_XHIGH:
            densityStr = "XHDPI";
            break;
          case DisplayMetrics.DENSITY_400:
            densityStr = "XMHDPI";
            break;
          case DisplayMetrics.DENSITY_XXHIGH:
            densityStr = "XXHDPI";
            break;
          case DisplayMetrics.DENSITY_XXXHIGH:
            densityStr = "XXXHDPI";
            break;
        }
        return densityStr;
      } 
     
      /**
       * Get accounts string [ ].
       *
       * @return the string [ ]
       */
      @SuppressWarnings("MissingPermission") public String[] getAccounts() {
        try {

          if (BA.applicationContext.checkCallingOrSelfPermission(Manifest.permission.GET_ACCOUNTS)
              == PackageManager.PERMISSION_GRANTED) {
            Account[] accounts = AccountManager.get(BA.applicationContext).getAccountsByType("com.google");
            String[] result = new String[accounts.length];
            for (int i = 0; i < accounts.length; i++) {
              result[i] = accounts[i].name;
            }
            return result;
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
        return null;
      } 
     

      /**
       * Is network available boolean.
       *
       * @return the boolean
       */
      public boolean isNetworkAvailable() {
        if (BA.applicationContext.checkCallingOrSelfPermission(Manifest.permission.INTERNET)
            == PackageManager.PERMISSION_GRANTED
            && BA.applicationContext.checkCallingOrSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE)
            == PackageManager.PERMISSION_GRANTED) {
          ConnectivityManager cm = (ConnectivityManager) BA.applicationContext.getApplicationContext()
              .getSystemService(Context.CONNECTIVITY_SERVICE);
          NetworkInfo netInfo = cm.getActiveNetworkInfo();
          return netInfo != null && netInfo.isConnected();
        }
        return false;
      }

      /**
       * Is running on emulator boolean.
       *
       * @return the boolean
       */
      public static boolean isRunningOnEmulator() {
        return Build.BRAND.contains("generic")
            || Build.DEVICE.contains("generic")
            || Build.PRODUCT.contains("sdk")
            || Build.HARDWARE.contains("goldfish")
            || Build.MANUFACTURER.contains("Genymotion")
            || Build.PRODUCT.contains("vbox86p")
            || Build.DEVICE.contains("vbox86p")
            || Build.HARDWARE.contains("vbox86");
      } 
     


      /**
       * Is wifi enabled
       *
       * @return the boolean
       */
      public boolean isWifiEnabled() {
        boolean wifiState = false;

        WifiManager wifiManager = (WifiManager) BA.applicationContext.getSystemService(Context.WIFI_SERVICE);
        if (wifiManager != null) {
          wifiState = wifiManager.isWifiEnabled() ? true : false;
        }
        return wifiState;
      }

      /**
       * Gets Device Ringer Mode
       *
       * @return Device Ringer Mode
       */
      public int getDeviceRingerMode() {
        int ringerMode = RINGER_MODE_NORMAL;
        AudioManager audioManager = (AudioManager) BA.applicationContext.getSystemService(Context.AUDIO_SERVICE);
        switch (audioManager.getRingerMode()) {
          case AudioManager.RINGER_MODE_NORMAL:
            ringerMode = RINGER_MODE_NORMAL;
            break;
          case AudioManager.RINGER_MODE_SILENT:
            ringerMode = RINGER_MODE_SILENT;
            break;
          case AudioManager.RINGER_MODE_VIBRATE:
            ringerMode = RINGER_MODE_VIBRATE;
        }
        return ringerMode;
      }


      private Intent getBatteryStatusIntent() {
        IntentFilter batFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        return BA.applicationContext.registerReceiver(null, batFilter);
      }


      private String handleIllegalCharacterInResult(String result) {
        if (result.indexOf(" ") > 0) {
          result = result.replaceAll(" ", "_");
        }
        return result;
      }


    #End If
     
  8. PassionDEV

    PassionDEV Active Member Licensed User

    update to this matter of detecting emulator

    after searching i think that checking device module like fingerprint , id, radioversion etc... will not be an efficient way
    the only way that can detect a specific emulator is to locate a file that will only exist on that emulator

    i found a reference to it at the following url

    https://github.com/framgia/android-...ramgia/android/emulator/EmulatorDetector.java

    but i couldn't translate this to B4a

    and it seems outdated . but the base is to locate a file that should be exist on emulators

    as example like the following files

    Code:
    private static final String[] ANDY_FILES = {
            
    "fstab.andy",
            
    "ueventd.andy.rc"
    };
    we could use fileexist in b4a but i have no idea on which dir i have to check
     
  9. DonManfred

    DonManfred Expert Licensed User

    Code:
    private boolean checkFiles(String[] targets, String type) {
            
    for (String pipe : targets) {
                
    File qemu_file = new File(pipe);
                
    if (qemu_file.exists()) {
                    
    log("Check " + type + " is detected");
                    
    return true;
                
    }
            }
            return false;
    }
    This are pipenames. there is no special path for them. They exists or not.
     
    PassionDEV likes this.
  10. marcick

    marcick Well-Known Member Licensed User

    Sorry but ... how to use this ? ...
     
  11. PassionDEV

    PassionDEV Active Member Licensed User

    you can use this using java and i think you need to add PERMISSION_WRITE_EXTERNAL_STORAG using run time premission on targersdkveriosn 26+

    Code:
    #If Java

    import android.annotation.SuppressLint;
    import android.annotation.TargetApi;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.os.Build;
    import android.support.v4.content.ContextCompat;
    import android.telephony.TelephonyManager;
    import android.text.TextUtils;
    import android.util.Log;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    import android.Manifest;

      private boolean CheckFileonEmulator() {
            for (String pipe : "Here you can check the files you found on emulator") {
                File qemu_file = new File(pipe);
                if (qemu_file.exists()) {


                    return true;
                }
            }
            return false;
    }

    #End If
    To use the code you can use javaobject

    Code:
    'global variable Private NativeMe As JavaObject
    Dim s As Boolean = NativeMe.RunMethod("CheckFileonEmulator"Null)
     
    if s then
    log("detected")
    end if
    also you can define the java code like following

    Code:
    #If Java
    private static String[] BLUE_STACKS_File = {"define the file name you found on emulator"};

    public static boolean HasBluestacks() {
      for (String file : BLUE_STACKS_File) {
       File geny_file = new File(file);
        if (geny_file.exists()) {
          return true;
        }
        }

       return false;
    }

    #End If
     
    Last edited: Apr 30, 2019
  12. PassionDEV

    PassionDEV Active Member Licensed User

    it would be nice if you share any special files you find on emulators sense i couldn't find one yet i am still wonder how game like PUBG Mobile Detect emulators though also i find a few b4a apps on play store detect those emulators as well .
     
  13. marcick

    marcick Well-Known Member Licensed User

    I'm probably missing in a glass of water but I get this error

    Code:
    B4A Version: 9.00
    Parsing code.    (
    0.00s)
    Building folders structure.    (
    0.07s)
    Compiling code.    (
    0.06s)
    Compiling layouts code.    (
    0.00s)
    Organizing libraries.    (
    0.00s)
    Generating R 
    file.    (0.00s)
    Compiling debugger engine code.    (
    7.11s)
    Compiling generated Java code.    Error
    javac 
    1.8.0_51
    src\b4a\example\main.java:
    10: error: package android.support.v4.content does not exist
    import android.support.v4.content.ContextCompat;
                                     ^
    Note: src\b4a\example\starter.java uses 
    or overrides a deprecated API.
    Note: Recompile with -Xlint:deprecation 
    for details.
    1 error
    And source code is

    Code:
    Sub Process_Globals
        
    Private NativeMe As JavaObject
    End Sub

    Sub Globals
    End Sub

    Sub Activity_Create(FirstTime As Boolean)
        
    Activity.LoadLayout("Layout1")
        
    If FirstTime Then
            NativeMe.InitializeContext
        
    End If
        
    Dim s As Boolean = NativeMe.RunMethod("CheckFileonEmulator"Null)
        
    If s Then
            
    Log("detected")
        
    End If
        
    End Sub

    Sub Activity_Resume
    End Sub

    Sub Activity_Pause (UserClosed As Boolean)
    End Sub

    #If Java

    import android.annotation.SuppressLint;
    import android.annotation.TargetApi;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.os.Build;
    import android.support.v4.content.ContextCompat;
    import android.telephony.TelephonyManager;
    import android.text.TextUtils;
    import android.util.Log;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;
    import android.Manifest;

      private boolean CheckFileonEmulator() {
            for (String pipe : "Here you can check the files you found on emulator") {
                File qemu_file = new File(pipe);
                if (qemu_file.exists()) {


                    return true;
                }
            }
            return false;
    }

    #End If
     
  14. PassionDEV

    PassionDEV Active Member Licensed User

    Remove the unused packages from java code
    And the error certain to this package

    Code:
    import android.support.v4.content.ContextCompat;
    Just remove it its not needed and not used i just copied the packages from the github url

    Note i write the code in the forum code editor
     
  15. DonManfred

    DonManfred Expert Licensed User

    try adding
    Code:
    #additionaljar: com.android.support:support-compat
     
  16. marcick

    marcick Well-Known Member Licensed User

    Still don't understand: what I should write instead of "Here you can check the files you found on emulator" ?
     
  17. PassionDEV

    PassionDEV Active Member Licensed User

    The idea is to catch a file that can be used on this emulator you can use Esexplore to search for specific file that can be exist only on this emulator
     
  18. marcick

    marcick Well-Known Member Licensed User

    Please be patient ....
    Can you paste here a full b4a code that works and look for something ?
     
  19. PassionDEV

    PassionDEV Active Member Licensed User

    Code:
    Sub Activity_Create(FirstTime As Boolean)
        
    Activity.LoadLayout("Layout1")
        
    If FirstTime Then
            NativeMe.InitializeContext
        
    End If
        
    Dim s As Boolean = NativeMe.RunMethod("HasBluestacks"Null' this will detect those files on all android versions that have this files..
        If s Then
            
    Log("detected")
        
    End If
       
    End Sub



    'note Blue_stacks_file is exist on all android versions so this is example file sense i dont know yet a special file that can be exist on bluestacks4

    #if Java

    import android.annotation.TargetApi;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.pm.ResolveInfo;
    import android.os.Build;
    import android.telephony.TelephonyManager;
    import android.text.TextUtils;
    import android.util.Log;
    import java.io.File;
    import java.util.List;
    import android.Manifest;

    private static String[] BLUE_STACKS_File = {"/boot/bstsetup.env"};

    public static boolean HasBluestacks() {
      for (String file : BLUE_STACKS_File) {
       File geny_file = new File(file);
        if (geny_file.exists()) {
          return true;
        }
        }

       return false;
    }

    #end if
     
  20. marcick

    marcick Well-Known Member Licensed User

    ok thanks, now it works. :)
    So the problem is to identify wich special file could exist only in the emulator ... looks hard ... o_O
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice