Android APN的設置問題

1、問題的引入
       在android源碼,成功執行瞭make 和 make sdk,也最終燒到開發板上瞭!不幸的是插入SIM卡卻無法上網,必須手動設置APN後才能上網,而有些“菜鳥級”用戶卻無從下手,就需要我們開發者給他提供方便瞭!如何保證在插入SIM卡後就已經自動設置好APN呢?此時隻要用戶輕輕一點對應指定SIM卡的APN就OK瞭!
 
2、問題的分析
 
2-1、apn的流程分析及相關文件
首先配置環境變量 ,在~/.bashrc文件中添加
export ANDROID_SRC_HOME = /mnt/yqmiao/android_2.1
 
相關文件作如下簡單說明:
main.mk — $ANDROID_SRC_HOME/build/core/main.mk
–從該文件[核心Makefile文件]中可以看出有關apn設置的xml文件
摘錄如下:
# Install an apns-conf.xml file if one's not already being installed.
ifeq (,$(filter %:system/etc/apns-conf.xml, $(PRODUCT_COPY_FILES)))
  PRODUCT_COPY_FILES += \
        development/data/etc/apns-conf_sdk.xml:system/etc/apns-conf.xml
  ifeq ($(filter eng tests,$(TARGET_BUILD_VARIANT)),)
    $(warning implicitly installing apns-conf_sdk.xml)
  endif
endif

apns-conf_sdk.xml — $ANDROID_SRC_HOME/development/data/etc/apns-conf_sdk.xml
–主要用於生成system/etc/apns-conf.xml文件,生成過程本質上就是原文拷貝

apns.xml — $ANDROID_SRC_HOME/frameworks/base/core/res/res/xml/apns.xml
–該文件實際上在apn的設置方面沒有實際意義,然而在android apn設置的邏輯方面卻很重要,尤其是裡面的version的值。

apns-conf.xml — $ANDROID_SRC_HOME/out/target/product/generic/system/etc/apns-conf.xml
–該內容最終打包到system.img中:
效果查看:
1)運行模擬器
c#../../../host/linux-x86/bin/emulator”>root@ubuntuorg:$ANDROID_SRC_HOME/out/target/product/generic#../../../host/linux-x86/bin/emulator -system system.img -data userdata.img -ramdisk ramdisk.img
2)進入terminate
adb shell
cat /system/etc/apns-conf.xml 
註:此文件就是來源於此!!
 
TelephonyProvider.java —  $ANDROID_SRC_HOME/packages/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java
–該class主要用於APN的設置,由於源碼提供的不符合定制要求,所以要手動修改!
但是修改最終目的是保證在數據庫version更新後,能夠及時更新維護APN的數據庫表內容!
具體該類如何修改,下文會闡述!

首先保證成功運行瞭Emulator或開發板,查看APN所維護的數據,操作如下:
# adb shell
# cd /data/data/com.android.providers.telephony/databases
# sqlite3 telephony.db
sqlite> .dump carriers
 
2-2、具體修改實現
*************修改apns-conf_sdk.xml文件***********
添加新的apn設置
eg:
<apn carrier="中國聯通"
    apn="3gnet"
    proxy=""
    port=""
    user=""
    password=""
    server=""
    mmsc=""
    mcc="460"
    mnc="01"
    mmsproxy=""
    mmsport=""
    type=""
/>
其中的一些屬性即使是賦空字符串,也不可以去掉。
修改version的值,保證比原始值大:
<apns version="7">

</apns>

**************修改apns.xml文件******************
修改version的值,保證比原始值大,並且要和上一步設置的version的值相同
eg:
<apns version="7">

</apns>
以後每一次修改APN都要修改version的值
 
**************修改TelephonyProvider.java 文件*******
修改的目的,上面已提及!
eg1:
 @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         if(oldVersion < newVersion)
         {
          final int count = db.delete(CARRIERS_TABLE, null, null) ;         
          initDatabase(db) ;
         }
        }
 
eg2:
 @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            if (oldVersion < newVersion) {
             db.beginTransaction() ;
             db.execSQL("DROP TABLE IF EXISTS " + CARRIERS_TABLE + ";") ;
             db.execSQL("CREATE TABLE IF NOT EXISTS " + CARRIERS_TABLE +
                        "(_id INTEGER PRIMARY KEY," +
                            "name TEXT," +
                            "numeric TEXT," +
                            "mcc TEXT," +
                            "mnc TEXT," +
                            "apn TEXT," +
                            "user TEXT," +
                            "server TEXT," +
                            "password TEXT," +
                            "proxy TEXT," +
                            "port TEXT," +
                            "mmsproxy TEXT," +
                            "mmsport TEXT," +
                            "mmsc TEXT," +
                            "authtype INTEGER," +
                            "type TEXT," +
                            "current INTEGER);") ;
             db.endTransaction() ;
             initDatabase(db) ;
            }
        }
經過測試發下,eg2可能會更好!
 
2-3、編譯make
root@ubuntu-org:/mnt/yqmiao/android_2.1# . ./build/envsetup.sh
root@ubuntu-org:/mnt/yqmiao/android_2.1#make
 
make結束以後,若沒有配置,那麼配置如下:
eg:
1)在~/.bashrc文件中添加如下:
export ANDROID_SRC_HOME = /mnt/yqmiao/android_2.1
export PATH=$PATH:$ANDROID_SRC_HOME /out/host/linux-x86/bin
exportANDROID_PRODUCT_OUT=$ANDROID_SRC_HOME/out/target/product/generic
 
2)保存退出後:
source  ~/.bashrc
 
3)然後運行Emulator
emulator
 
3、結果驗證
1)
在模擬器成功啟動以後,進入telephony.db數據庫中的carriers表中進行查看!
 
2)
在開發板上插入SIM卡後,進入APN設置頁面查看
 
4、結論分析
1)android源碼不支持本地化[不同國傢及服務提供商]的APN自動化設置。
 
2)有些論壇提及如何配置APN,然而沒有提及修改version的值及修改java源
代碼,隻是簡單地在apns-conf_sdk.xml文件中添加新的apn,所以總是失敗而終,究其原因TelephonyProvider.java文件無法保證新增APN添加到telephony.db中,本質原因還是ContentProvider的生命周期決定的,onCreate隻是在第一次運行時執行,以後就不會再執行瞭;此後需要通過onUpdate來更新db的table,此時就需要修改db的version瞭。
 
3)希望讀者們修改順利!!

 

摘自 苗運齊的博客

發佈留言