Надежный способ определения того, работает ли приложение Android в «BlueStacks»,

Я хотел бы узнать во время выполнения внутри Android-приложения, работает ли он в эмуляторе Android BlueStacks . Это значит, что я могу изменить способ запуска приложения при работе в BlueStacks.

BlueStacks не поддерживает multi-touch, поэтому я хочу реализовать альтернативу стандартным функциям pinch-to-zoom, которые есть в моем текущем приложении.

Например

If (appIsRunningInBlueStacks){ mySurfaceView.enableMultiTouchAlternatives(); } else{ mySurfaceView.enableMultiTouchFeatures(); } 

Каков надежный способ определения ценности appIsRunningInBlueStacks?

EDIT Резюме ответов на комментарии к вопросу:

Бен, Тарас, спасибо за предложения. Значения Build.MODEL и др. Для BlueStacks:

  • Модель: "GT-I9100"

  • Производитель: "samsung"

  • Устройство: "GT-I9100"

  • Продукт: «GT-I9100»

Это тот же номер модели, что и Samsung Galaxy SII, поэтому было бы нецелесообразно использовать это, опасаясь, что все пользователи будут использовать SII так же, как и на BlueStacks.

CommonsWare, приложение продолжает работать в BlueStacks даже с помощью <uses-feature> для multitouch в манифесте. На самом деле (также отвечая на вопрос iagreen) …

 packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT); 

… возвращает true! Этого можно ожидать, я полагаю, поскольку эмулятор убежден, что это Samsung Galaxy SII!

Поэтому мы по-прежнему не можем надежно определить, работает ли приложение на BlueStacks, не бросая всех пользователей Samsung Galaxy SII в то же самое ведро. Любые другие идеи?

Вы можете проверить наличие общей папки Bluestacks / sdcard / windows / BstSharedFolder

  Boolean onBlueStacks() { File sharedFolder = new File(Environment .getExternalStorageDirectory().toString() + File.separatorChar + "windows" + File.separatorChar + "BstSharedFolder"); if (sharedFolder.exists()) { return true; } return false; } 

Моя версия BlueStacks сообщает о моем Build.Model как GT-N7100 .

Использование: android.opengl.GLES20.glGetString(android.opengl.GLES20.GL_RENDERER) Я получаю Bluestacks .

Это будет уникально.

В Bluestack нет устройства Bluetooth.

Поэтому попробуйте получить строку «Адрес Bluetooth», которая всегда «null» на Bluestack или любом эмуляторе. Убедитесь, что вы добавили разрешение Bluetooth в манифест проекта.

 BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); String m_bluetoothAdd = m_BluetoothAdapter.getAddress(); 

Я также искал решение этого, я нашел этот фрагмент кода в каком-то китайском блоге при поиске, я не могу понять, что он делает, но может быть, кто-то еще может?

  public boolean isEmulator() { String android_id = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); Log.d("ares","ANDROID_ID: "+android_id); Log.d("ares","Build.PRODUCT: "+Build.PRODUCT); boolean emulator = TextUtils.isEmpty(android_id) || "google_sdk".equals( Build.PRODUCT ) || "sdk".equals(Build.PRODUCT); return emulator; } 

Пожалуйста, проигнорируйте, если он полностью не поможет …