2013-01-03 15 views
11

Chciałbym sprawdzić podczas uruchamiania w aplikacji na Androida, czy działa ona w emulatorze Android BlueStacks. Dzięki temu mogę zmodyfikować sposób działania aplikacji podczas pracy w BlueStacks.Niezawodny sposób sprawdzania, czy aplikacja na Androida działa w "BlueStacks"

BlueStacks nie obsługuje funkcji multi-touch, więc chcę zaimplementować alternatywę dla standardowej funkcji pinch-to-zoom, którą ma moja obecna aplikacja.

E.g.

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

Co to jest niezawodny sposób na ustalenie wartości AppIsRunningInBlueStacks?

EDIT Podsumowanie odpowiedzi na komentarze na pytanie:

Ben, Taras, dzięki za sugestie. W Build.MODEL itp wartości BlueStacks to:

  • Model: "GT-I9100"

  • Producent: "samsung"

  • Urządzenie: "GT-I9100"

  • produktu: "GT-I9100"

jest to ten sam model num jako Samsung Galaxy SII, więc nie byłoby idealnym rozwiązaniem do korzystania z tego w obawie, że wszyscy użytkownicy będą traktowani tak samo jak użytkownicy BlueStacks.

Ogólnie, aplikacja nadal działa w BlueStacks nawet przy użyciu funkcji < dla funkcji multitouch w manifeście. W rzeczywistości (także odpowiadając na pytanie iagreen) ...

packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT); 

... zwraca prawdę! Można się tego spodziewać, jak przypuszczam, ponieważ emulator jest przekonany, że jest to Samsung Galaxy SII!

W związku z tym wciąż nie mamy możliwości niezawodnego wykrycia, czy aplikacja działa na BlueStacks, nie rzucając jednocześnie wszystkich użytkowników Samsung Galaxy SII do tego samego zasobnika. Jakieś inne pomysły?

+1

Czy próbowałeś zerknąć przez 'android.os.Build'? (http://developer.android.com/reference/android/os/Build.html) –

+0

Tak, spróbuj sprawdzić Android.os.Build MODEL, PRODUCENTA, URZĄDZENIE, stałe PRODUKTU w czasie wykonywania i sprawdzenie ich wartości, niż po prostu sprawdź jeden parametru, który działa najlepiej i jest unikalny w czasie wykonywania. –

+1

Czy masz odpowiednie elementy '' do anonsowania, że ​​potrzebujesz multitouch? A może BlueStacks to ignoruje? – CommonsWare

Odpowiedz

-1

Szukałem również rozwiązania tego problemu, znalazłem ten fragment kodu na jakimś chińskim blogu podczas wyszukiwania, nie mogę zrozumieć, co robi, ale może ktoś inny może?

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; 
    } 

Proszę zignorować jeśli jej zupełnie nie pomaga ...

+0

Również widzę ten post ma prawie rok. Czy znalazłeś rozwiązanie? – law

2

Moja wersja BlueStacks donosi mój Build.Model jak GT-N7100.

Używanie: android.opengl.GLES20.glGetString(android.opengl.GLES20.GL_RENDERER) Dostaję Bluestacks.

3

Można sprawdzić, że BlueStacks udostępnionego folderu istnieć /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; 
     } 
0

To będzie wyjątkowy.

W Bluestack nie ma urządzenia bluetooth.

Spróbuj więc uzyskać ciąg adresu Bluetooth, który zawsze ma wartość "null" na Bluestack lub dowolnym emulatorze. Upewnij się, że dodajesz uprawnienia Bluetooth do manifestu projektu.

BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

String m_bluetoothAdd = m_BluetoothAdapter.getAddress();