에뮬레이터에서 실행할 때 장치에서 실행할 때와 코드가 약간 다르게 실행되도록하고 싶습니다. ( 예를 들어 , 공개 URL 대신 10.0.2.2를 사용하여 개발 서버에 대해 자동으로 실행합니다.) 에뮬레이터에서 Android 애플리케이션이 실행될 때 감지하는 가장 좋은 방법은 무엇입니까?
답변
이 솔루션은 어떻습니까?
fun isProbablyAnEmulator() = 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.BOARD == "QC_Reference_Phone" //bluestacks
|| Build.MANUFACTURER.contains("Genymotion")
|| Build.HOST.startsWith("Build") //MSI App Player
|| (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| "google_sdk" == Build.PRODUCT
일부 에뮬레이터는 실제 장치의 정확한 사양을 위조하므로 감지하지 못할 수도 있습니다.
여기에 APK에서 만들 수있는 작은 스 니펫이 나와 있습니다.
textView.text = "FINGERPRINT:${Build.FINGERPRINT}\n" +
"MODEL:${Build.MODEL}\n" +
"MANUFACTURER:${Build.MANUFACTURER}\n" +
"BRAND:${Build.BRAND}\n" +
"DEVICE:${Build.DEVICE}\n" +
"BOARD:${Build.BOARD}\n" +
"HOST:${Build.HOST}\n" +
"PRODUCT:${Build.PRODUCT}\n"
답변
하나의 일반적인 하나 Build.FINGERPRINT.contains("generic")
답변
글쎄, 안드로이드 ID가 나를 위해 작동하지 않습니다, 나는 현재 사용하고 있습니다 :
"google_sdk".equals( Build.PRODUCT );
답변
다른 답변의 힌트를 바탕으로 아마도 가장 강력한 방법 일 것입니다.
isEmulator = "goldfish".equals(Build.HARDWARE)
답변
Google은 Flutter 의 device-info 플러그인 에서이 코드를 사용 하여 기기가 에뮬레이터인지 확인합니다.
private boolean isEmulator() {
return (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| Build.FINGERPRINT.startsWith("generic")
|| Build.FINGERPRINT.startsWith("unknown")
|| Build.HARDWARE.contains("goldfish")
|| Build.HARDWARE.contains("ranchu")
|| Build.MODEL.contains("google_sdk")
|| Build.MODEL.contains("Emulator")
|| Build.MODEL.contains("Android SDK built for x86")
|| Build.MANUFACTURER.contains("Genymotion")
|| Build.PRODUCT.contains("sdk_google")
|| Build.PRODUCT.contains("google_sdk")
|| Build.PRODUCT.contains("sdk")
|| Build.PRODUCT.contains("sdk_x86")
|| Build.PRODUCT.contains("vbox86p")
|| Build.PRODUCT.contains("emulator")
|| Build.PRODUCT.contains("simulator");
}
답변
아래 코드와 같이 앱이 디버그 키로 서명되었는지 여부는 어떻습니까? 에뮬레이터를 감지하지 못하지만 목적에 따라 작동 할 수 있습니까?
public void onCreate Bundle b ) {
super.onCreate(savedInstanceState);
if ( signedWithDebugKey(this,this.getClass()) ) {
blah blah blah
}
blah
blah
blah
}
static final String DEBUGKEY =
"get the debug key from logcat after calling the function below once from the emulator";
public static boolean signedWithDebugKey(Context context, Class<?> cls)
{
boolean result = false;
try {
ComponentName comp = new ComponentName(context, cls);
PackageInfo pinfo = context.getPackageManager().getPackageInfo(comp.getPackageName(),PackageManager.GET_SIGNATURES);
Signature sigs[] = pinfo.signatures;
for ( int i = 0; i < sigs.length;i++)
Log.d(TAG,sigs[i].toCharsString());
if (DEBUGKEY.equals(sigs[0].toCharsString())) {
result = true;
Log.d(TAG,"package has been signed with the debug key");
} else {
Log.d(TAG,"package signed with a key other than the debug key");
}
} catch (android.content.pm.PackageManager.NameNotFoundException e) {
return false;
}
return result;
}
답변
이 코드는 나를 위해 작동합니다
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String networkOperator = tm.getNetworkOperatorName();
if("Android".equals(networkOperator)) {
// Emulator
}
else {
// Device
}
장치에 SIM 카드가없는 경우 빈 문자열을 다시 조정합니다 : “”
Android 에뮬레이터는 항상 “Android”를 네트워크 운영자로 재조정하므로 위 코드를 사용합니다.