android設備內部添加apn信息


  由於工作原因今天需要給多台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.重啟設備即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM