那就會想到,怎麼判斷乙個裝置是模擬器還是真機。
先說思路。
1.那些說用imei的,mac值,device_id,以及telephony_service中的運營商,國家的,什麼亂七八糟不靠譜的。首先都是錯誤的思路。
你們還以為現在的模擬器是studio上的模擬器嗎?求你們寫**之前,先研究一下模擬器的功能。夜神,逍遙,這些模擬器上面明明白白的寫著,修改imei碼,修改裝置資訊,修改運營商,手機號碼等等等等。你和我說通過判斷這些資訊的預設值。
2.那些不靠譜的去除了,我們該如何去判斷呢?
那就要判斷一下是不是有什麼硬體裝置是模擬器上沒有的呢?很容易想到的就是藍芽功能。我們通過獲取系統服務獲取到藍芽,判斷藍芽是否存在,然後發現模擬器也有藍芽。不要慌,獲取一下藍芽的名稱發現null。好了。再看看真機的效果。這就出來了。
/*** 判斷藍芽是否有效來判斷是否為模擬器**
@return
true 為模擬器
*/public boolean
nothasbluetooth() else else
}}
我在做的時候就考慮,乙個藍芽是否足夠!廢話,當然不夠啦。那還有什麼呢?瞬間想到了感測器。溫度,重力,光,還有其他一堆。經過測試發現,模擬器上也有很多感測器,同時有部分感測器沒有。而在真機上,同樣也有部分手機沒有溫度,壓力等感測器。經過乙個個的測試選擇。我選擇了光感測器。
/*** 判斷是否存在光感測器來判斷是否為模擬器
* 部分真機也不存在溫度和壓力感測器。其餘感測器模擬器也存在。
*@return
true 為模擬器
*/public static boolean nothaslightsensormanager(context context) else
}
既然模擬器都能模擬手機,那是不是模擬器出來的所有裝置資訊是不是有什麼特徵呢?通過列印一堆的device引數。經過網上的參考。就是下面這個**了。
/*** 根據部分特徵引數裝置資訊來判斷是否為模擬器**
@return
true 為模擬器
*/public static boolean
isfeatures()
好了,和裝置硬體相關的就差不多這幾個方法了。那其他方法呢?那模擬器基本上都是執行在電腦上的,電腦的架構是x86。手機正常的是arm的。那是不是可以通過獲取cpu來判斷呢?基本上就是intel和amd兩種吧?
public static string readcpuinfo() ;processbuilder cmd = new processbuilder(args);
process process = cmd.start();
stringbuffer sb = new stringbuffer();
string readline = ""
;bufferedreader responsereader = new bufferedreader(new inputstreamreader(process.getinputstream(),
"utf-8"));
while ((readline = responsereader.readline()) != null)
responsereader.close();
result = sb.tostring().tolowercase();
} catch (ioexception ex)
return result;
}/**
* 判斷cpu是否為電腦來判斷 模擬器**
@return
true 為模擬器
*/public static boolean
checkisnotrealphone()
return false;
}
好了,通過以上方法,你可以過濾一大堆的模擬器了。
下面推薦乙個通過(匹配qemu的一些特徵檔案以及屬性) 來判斷。這個我也不會。也沒看懂。如果有需要的自己去檢視吧。
!!!!!!重要說明!!!!!!!!
經過n臺裝置測試以及n款模擬器測試。
1.逍遙模擬器竟然可以無視藍芽檢測。所以藍芽的方法已經失效。
2.還是這個逍遙模擬器,又***裝置特徵引數也已經失效了。
3.所以經過多方測試發現,通過硬體資訊去判斷模擬器的方法已經失效了。現在唯一比較靠譜的應該就剩這個cpu的檢測以及這個光感測器了吧?
4.如果有某位同學測試發現有模擬器可以過cpu檢測以及光感測器的麻煩說一下。
5.測試的時候又發現了乙個情況。如果你的專案裡面載入了so。那就別用cpu檢測了,那當然就是arm的架構了。到了這裡,那就只有光感測器了。
如果覺得不放心。那就請同學認真學習下面這篇文章中的關鍵點。
我們最後的方案也是通過學習這個文章的思想,然後再自己拓展。
在windows和mac上測試不同的模擬器,檢測出模擬器的有1.逍遙模擬器 2. 藍疊模擬器 3. 夜神模擬器 4. 靠譜助手 5. 天天模擬器 6. 海馬模擬器
通過這幾款模擬器的檢測,應該能說明這個方案比較可靠。
模擬器,真機區別
cpp view plain copy if ui user inte ce idiom uiuserinte ceidiompad else 請注意,如果你在建立專案的時候只支援一種裝置型別,上面的語句將始終返回選定ios裝置型別,如專案只支援iphone,即使在ipad上執行,前述的 依然返回i...
ios開發中判斷真機和模擬器
如果是模擬器 if target iphone simulator else 以下內容摘自 target iphone simulator和target os iphone 是蘋果的兩個巨集定義,在真機sdk中位於ios usr include targetconditionals.h中,在模擬器s...
Android 模擬器錯誤
啟動android模擬器時.有時會報the connection to adb is down,and a severe error has occured.的錯誤.在說在任務管理器上把所有adb.exe關閉掉.重啟eclipse.但試過不管用.所以在外國 上找到一種可行的方法 1.先把eclips...