由於工作原因今天需要給多台android設備中寫入某張sim卡的apn相關信息,雖然可以通過sqlite命令寫sql語句來寫入到設備中,但設備一多起來就太低效了,所以在學習的過程中摸索着寫了一個將apn信息內置到設備中的腳本,具體過程如下:
1.首先需要進入到android設備中,然后獲取設備的root權限
1 adb shell 2 su
注意:如果提示沒有adb的消息則代表系統中沒有安裝adb,可以使用下面命令進行安裝:
1 sudo apt-get install android-tools-adb
2.使用下面命令來查詢准備寫入的sim信息是否存在
1 content query --uri content://telephony/carriers --where "numeric='運營商編碼' and apn='目標 apn'"
注意:運營商編碼就是例如“46001”之類的,目標apn則是“3gnet”之類的,想必你要寫入apn信息的話這些都應該是已知的
3.經過上面的查詢,如果出現“No result found.”則表示沒有相關的信息,就需要將apn信息插入到設備中,命令如下:
content insert --uri content://telephony/carriers --bind name:s:"title" --bind numeric:s:"46001" --bind type:s:"default,sulp" --bind mcc:i:460 --bind mnc:s:"01" --bind apn:s:"apn信息" --bind user:s:"" --bind password:s:""
解析:上述命令是將后半部的信息插入到設備中,比較重要的只有4處,分別是numeric、mcc、mnc、apn。拿--bind name:s:"title"和46001信息來舉例說明,name是當條信息的key值,比如:name(這個隨意寫,但一般和apn保持一致,就是一個title)、numeric(就是運營商編碼,比如聯通的46001)、mcc(運營商編碼的前3位,例如460)、mnc(運營商編碼的后兩位比如01)還有apn(就是apn的信息,例如3gnet),user和password可以為空,其余的都是默認值即可
4.執行完插入應該再次執行step2來檢查是否插入成功,如果成功了則可以進行下一步
5.此時設備中已經存有了插入的apn信息,經實際測試,此時設備已經可以使用放入的apn信息。由於本人的工作需要是將腳本放入設備中執行,所以省略掉了adb shell 命令,如果您的需求實在設備外部執行則需要添加adb,不同之處我會在()中添加相關命令
1 queryResult='No result found.'//定義一個查詢不存在信息的結果返回值 2 (adb wait-for-device //等待adb,直到adb shell 可用) 3 resultFirst=`(adb shell)content query --uri content://telephony/carriers --where "numeric='46001' and apn='3gnet'" | busybox sed 's/\r/\0/'`
//``符號是鍵盤上數字1左邊的~鍵,本條命令是查詢numeric和apn符合條件的信息,由於查詢結果的尾部會有不可見字符,設備內無法使用tr替換,所以這里使用了busybox sed命令將不可見字符替換 4 if [ "$resultFirst"x = "$queryResult"x ];then//判斷查詢結果是否等於“No result found”,x是規避掉變量為空的情況 5 echo "Add target apn info!"//如果信息不存在則insert 6 `content insert --uri content://telephony/carriers --bind name:s:"3gnet" --bind numeric:s:"46001" --bind type:s:"default,sulp" --bind mcc:i:460 --bind mnc:s:"01" --bind apn:s:"3gnet" --bind user:s:"" --bind password:s:""` 7 else 8 echo "Alreay have target apn!"//信息存在的話則不需要插入,退出程序即可 9 exit -1 10 fi 11 //插入信息之后還需要驗證一下,所以此處再次查詢 12 resultSecond=`content query --uri content://telephony/carriers --where "numeric='46001' and apn='3gnet'" | busybox sed 's/\r/\0/` 13 if [ "$resultSecond"x = "$queryResult"x ];then 14 echo "Insert target apn info faild."//判斷信息是否插入成功,不成功則提示插入失敗,退出程序,后續根據需求自行處理 15 exit -1 16 else 17 echo "Insert apn success"//插入成功 18 fi
注意:自測步驟:查詢當前設備的preferapn信息,並將設備中的所有numeric和apn信息等於preferapn的記錄刪除掉,然后重啟設備,此時設備應該無法工作,然后執行腳本,將測試數據插入設備,重啟設備,設備應該恢復正常,查詢插入數據和preferapn,應該就是剛剛插入的apn信息,刪除數據的命令如下:
1 content delete --uri content://telephony/carriers --where "numeric='46001' and apn='3gnet'"
6.重啟設備之后即可使用該apn信息,看到還有說插入preferapn信息的,我也驗證過,但我發現在我的設備中在插入apn信息重啟設備之后,設備的preferapn信息自動替換掉了,但這里還是把perferapn的相關命令記錄下。
1 content query --uri content://telephony/carriers/preferapn //查詢preferapn的信息
2 content insert --uri content://telephony/carriers/preferapn --bind apn_id:i:**** //此命令是將上面插入的apn信息插入到preferapn中,step2的查詢得到的結果中有一個字段為_id,將該apn信息的_id填入此處,即可將該id對應的信息插入到preferapn中
7.重啟設備即可
