android 電話服務(wù)就是通過AT來實(shí)現(xiàn)的,不過不是java應(yīng)用層直接發(fā)AT
創(chuàng)新互聯(lián)建站專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、項(xiàng)城網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、成都商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為項(xiàng)城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
而是通過socket,把命令發(fā)到RIL層,RIL篩選AT命令,與底層交互,實(shí)現(xiàn)電話的各個功能
你可以查一查RIL的實(shí)現(xiàn)
AT命令(Attention)在手機(jī)中,用于對modem(也就是移動模塊)通過串口命令進(jìn)行操作,處理與語音電話、短信和數(shù)據(jù)。
關(guān)于AT命令:
Android系統(tǒng)與AT命令
對于智能手機(jī),AP和BP分離的情況,在AP上的系統(tǒng)通過串口和BP通信是個不錯方式。在Android的源碼中有一個內(nèi)部包c(diǎn)om.android.internal.telephony中有對AT命令的封裝和解析,但這種internal的包開發(fā)者不能調(diào)用的SDK部分,可以用來封裝ROM。這說明Android對AT command的方式是支持的。
對于Android如何調(diào)用AT command
用root登錄命令行,直接對串口進(jìn)行操作,如echo -e "AT\r" /dev/smd0
具體的串口,不同設(shè)備會有不同,甚至不一定會提供。這種方式,開發(fā)者是可以調(diào)用的,通過Runtime.exec直接執(zhí)行命令行命令,但要求是root,例如echo -e "ATD123456789;\r" /dev/smd0,撥打123456789的號碼。
目前最新的AT命令標(biāo)準(zhǔn)發(fā)布與2014.6.27,似乎還活得挺滋潤的。但是給出的keywords是UMTS, GSM, command, terminal, LTE這說明CDMA確實(shí)很可能不是采用AT命令的方式。
一、準(zhǔn)備測試環(huán)境及測試文件
1、安裝Java JDk,設(shè)置好環(huán)境變量
2、安裝Android SDK,設(shè)置好環(huán)境變量(詳細(xì)步驟略)
3、準(zhǔn)備被測apk及測試所需的一些工具
二、啟動模擬器,并解鎖
批處理腳本:
emulator -avd Galaxy4.2 ::啟動模擬器
ping -n 90 127.0.0.1nul ::等待模擬器啟動成功,-n 90 為等待時間,建議設(shè)置大一點(diǎn)
adb shell input keyevent 82 ::模擬器打開后都會鎖屏,adb模擬鍵盤輸入,解鎖
ping -n 2 127.0.0.1nul
三、腳本參數(shù)初始化
代碼如下:
set appName=TestAndroid.apk ::被測程序名稱
set pkgName=com.example.testandroid ::被測程序包名
set openName=com.example.testandroid.MainActivity ::被測試程序主activity
set "times=%1" ::測試次數(shù),腳本傳入?yún)?shù)
xcopy blat.exe C:\Windows\System32\ /Y ::將郵件工具復(fù)制到系統(tǒng)文件夾下,需關(guān)閉360衛(wèi)士
四、循環(huán)執(zhí)行安裝打開關(guān)閉卸載
echo 測試開始source.txt ::創(chuàng)建一個source文件記錄日志
for /l %%a in (1,1,%times%) do (
adb install TestAndroid.apk ::安裝apk
adb shell am start -W -n %pkgName%/%openName% ::打開apk
call cmd /c close.bat %pkgName% ::關(guān)閉apk
adb uninstall %pkgName% ::卸載apk
adb logcat -d |findstr "^D/k.*}\" ::過濾logcat,獲取需要的內(nèi)容
adb logcat -c ::清除logcat日志
taskkill /f /im adb.exe)source.txt ::結(jié)束adb進(jìn)程,防止占用source文件
::每次操作日志都記錄在source中
五、處理source.txt提取關(guān)鍵信息,并發(fā)送郵件
六、設(shè)置windows定時任務(wù),參數(shù)填寫為測試次數(shù),完成。
將16進(jìn)制的字符串轉(zhuǎn)換成bytes,通過hexstring2bytes轉(zhuǎn)換而不能直接用getbytesString string = "41542B50494F392C310D"; mmOutStream.write(string.getBytes());讀取inputsteam中的 ? Log.d("example", "do read"); 不執(zhí)行,完整代碼如下:?/*** This thread runs during a connection with a remote device. It handles all* incoming and outgoing transmissions.*/ private class ConnectedThread extends Thread {private final BluetoothSocket mmSocket;private final InputStream mmInStream;private final OutputStream mmOutStream;public ConnectedThread(BluetoothSocket socket, String socketType) {Log.d(TAG, "create ConnectedThread: " + socketType);mmSocket = socket;InputStream tmpIn = null;OutputStream tmpOut = null;// Get the BluetoothSocket input and output streamstry {tmpIn = socket.getInputStream();tmpOut = socket.getOutputStream();} catch (IOException e) {Log.e(TAG, "temp sockets not created", e);}mmInStream = tmpIn;mmOutStream = tmpOut;}public void run() {Log.i(TAG, "BEGIN mConnectedThread");byte[] buffer = new byte[1024];int bytes;// Keep listening to the InputStream while connectedwhile (true) {Log.d("example", "do read");try {// Read from the InputStreambytes = mmInStream.read(buffer);// Send the obtained bytes to the UI ActivitymHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes,-1, buffer).sendToTarget();} catch (IOException e) {Log.e(TAG, "disconnected", e);connectionLost();// Start the service over to restart listening modeBluetoothChatService.this.start();break;}}}/*** Write to the connected OutStream.** @param buffer* The bytes to write*/public void write(byte[] buffer) {String string = "41542B50494F392C310D";try {mmOutStream.write(string.getBytes());// Share the sent message back to the UI ActivitymHandler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1,buffer).sendToTarget();} catch (IOException e) {Log.e(TAG, "Exception during write", e);}}public void cancel() {try {mmSocket.close();} catch (IOException e) {Log.e(TAG, "close() of connect socket failed", e);}} }
1、hardware\ril\reference-ril\Reference-ril.c 中 onRequest() 處理RIL_REQUEST_DIAL 時會 調(diào)用requestDial();
2、requestDial()中轉(zhuǎn)換RIL_REQUEST_DIAL 請求為AT指令;
3、通過at_send_command()下發(fā);
4、經(jīng)過at_send_command_full,at_send_command_full_nolock ,writeline()寫到設(shè)備中。
android 電話服務(wù)就是通過AT來實(shí)現(xiàn)的,不過不是java應(yīng)用層直接發(fā)AT
而是通過socket,把命令發(fā)到RIL層,RIL篩選AT命令,與底層交互,實(shí)現(xiàn)電話的各個功能
你可以查一查RIL的實(shí)現(xiàn)