2013-01-03 10 views
11

Vorrei accertarmi in fase di esecuzione all'interno di un'app Android se è in esecuzione nell'emulatore Android BlueStacks. Questo è così posso modificare il modo in cui l'app viene eseguita durante l'esecuzione all'interno di BlueStacks.Modo affidabile per rilevare se un'applicazione Android è in esecuzione in "BlueStacks"

BlueStacks non supporta il multi-tocco, quindi voglio implementare un'alternativa alla funzionalità pinch-to-zoom standard della mia app attuale.

E.g.

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

Qual è un modo affidabile per determinare il valore di appIsRunningInBlueStacks?

EDIT Sintesi delle risposte ai commenti di domanda:

Ben, Taras, grazie per i suggerimenti. I valori Build.MODEL ecc per BlueStacks sono:

  • Modello: "GT-I9100"

  • Produttore: "samsung"

  • dispositivo: "GT-I9100"

  • prodotto: "GT-I9100"

Questo è lo stesso modello num come il Samsung Galaxy SII, quindi non sarebbe ideale utilizzarlo per paura di trattare tutti gli utenti con SII come quelli su BlueStacks.

CommonsWare, l'app continua a essere eseguita in BlueStacks anche con la funzione di utilizzo < per multitouch nel manifest. Infatti (rispondendo anche alla domanda di iagreen) ...

packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT); 

... restituisce vero! Questo è normale, suppongo che l'emulatore sia convinto che sia un Samsung Galaxy SII!

Pertanto, siamo ancora senza un modo per rilevare in modo affidabile se un'applicazione è in esecuzione su BlueStacks senza lanciare tutti gli utenti Samsung Galaxy SII nello stesso bucket. Altre idee?

+1

Hai provato a sbirciare attraverso 'android.os.Build'? (http://developer.android.com/reference/android/os/Build.html) –

+0

Sì, prova a verificare le costanti di Android.os.Build MODELLO, PRODUTTORE, DISPOSITIVO, PRODOTTO in fase di esecuzione e verificarne i valori, piuttosto che controllarne uno del parametro che funziona meglio ed è unico in fase di runtime. –

+1

Avete gli elementi appropriati '' per annunciare che avete bisogno di multitouch? O BlueStacks lo ignora? – CommonsWare

risposta

-1

Stavo anche cercando una soluzione a questo, ho trovato questo frammento di codice su un blog cinese durante la ricerca, non riesco a capire cosa sta facendo ma forse qualcun altro può?

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

Si prega di ignorare se totalmente nessun aiuto ...

+0

Anche io vedo questo post ha quasi un anno. Hai trovato la soluzione? – law

2

La mia versione di BlueStacks sta riportando la mia Build.Model come GT-N7100.

Utilizzo: android.opengl.GLES20.glGetString(android.opengl.GLES20.GL_RENDERER) Ottengo Bluestacks.

3

È possibile verificare che le Bluestacks cartella condivisa esiste /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

Questo sarà unica.

Non c'è un dispositivo bluetooth in Bluestack.

Quindi prova a ottenere la stringa di indirizzo Bluetooth che è sempre "nulla" su Bluestack o qualsiasi emulatore. Assicurati di aggiungere l'autorizzazione Bluetooth al manifest del tuo progetto.

BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 

String m_bluetoothAdd = m_BluetoothAdapter.getAddress(); 
Problemi correlati