APK擴(kuò)展文件及使用_第1頁(yè)
APK擴(kuò)展文件及使用_第2頁(yè)
APK擴(kuò)展文件及使用_第3頁(yè)
APK擴(kuò)展文件及使用_第4頁(yè)
APK擴(kuò)展文件及使用_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

APK擴(kuò)展文件基本知識(shí)一、APK擴(kuò)展文件基本知識(shí)

AndroidMarket(GooglePlayStore)中每個(gè)APK文件的最大限制是50MB。如果您的程序中包含大量的數(shù)據(jù)文件,以前您只能把這些數(shù)據(jù)文件放到自己的服務(wù)器上,當(dāng)用戶啟動(dòng)程序的時(shí)候讓用戶去下載?,F(xiàn)在這些數(shù)據(jù)文件可以直接上傳到AndroidMarket了。在新的Market控制臺(tái)上傳App的時(shí)候,可以添加擴(kuò)展文件了。

下面就來(lái)看看什么時(shí)候該使用擴(kuò)展文件,該如何使用?

每個(gè)APK可以有2個(gè)擴(kuò)展文件,每個(gè)文件最大限制是2GB。為了減少用戶的帶寬消耗,最好使用壓縮格式文件吧。這兩擴(kuò)展文件具有不同的用途:

第一個(gè)被稱為main(主)擴(kuò)展文件,該擴(kuò)展文件保護(hù)您程序中需要用到的附加數(shù)據(jù);

第二個(gè)被稱為patch擴(kuò)展(修補(bǔ))文件,該文件是可選的,并且應(yīng)該只包含一些不同版本的補(bǔ)丁數(shù)據(jù)。

當(dāng)然您可以按照您需要的方式來(lái)使用這兩個(gè)擴(kuò)展文件,不過(guò)Android官方還是推薦把這兩個(gè)文件的功能分開(kāi)。main擴(kuò)展文件包含核心數(shù)據(jù),并且盡量不隨程序版本的升級(jí)去修改;而patch擴(kuò)展文件可以隨程序版本的升級(jí)做修改。為了幫助大家理解具體的含義,我們使用一個(gè)地圖App來(lái)解釋下:

比如Google地圖程序需要包含一個(gè)離線地圖數(shù)據(jù)包,這樣可以方便用戶離線查看地圖,在程序發(fā)布的時(shí)候,可以把現(xiàn)有的離線數(shù)據(jù)包作為main擴(kuò)展文件上傳到Market。然后過(guò)了半年Google地圖更新了,新添加了一些剛剛修好的高速公路、新建立的商場(chǎng)等信息,可以把這些新增的信息作為patch擴(kuò)展文件使用。這樣Google地圖1.0版本對(duì)應(yīng)一個(gè)main擴(kuò)展文件;而Google地圖1.1版本對(duì)應(yīng)一個(gè)main擴(kuò)展文件和一個(gè)1.1版本的patch擴(kuò)展文件;Google地圖1.2版本對(duì)應(yīng)一個(gè)main擴(kuò)展文件和一個(gè)1.2版本的patch擴(kuò)展文件。這里面的main擴(kuò)展文件是同一個(gè)文件而patch擴(kuò)文件是隨版本變化的。

這樣的好處就是當(dāng)程序升級(jí)的時(shí)候,用戶不用重新下載main擴(kuò)展文件了,只需要下載少量的新增文件即可,節(jié)省用戶流量。二、擴(kuò)展文件的命名格式

擴(kuò)展文件可以使用任何文件格式(ZIP,PDF,MP4,等)。不管任何文件格式Android都認(rèn)為他們是obb(opaquebinaryblobs)文件,并且會(huì)根據(jù)如下文件命名規(guī)則來(lái)重命名擴(kuò)展文件:

[main|patch].<expansion-version>.<package-name>.obbmainorpatch

指定文件是main擴(kuò)展文件還是patch擴(kuò)展文件,每個(gè)APK只能有一個(gè)main擴(kuò)展文件和一個(gè)patch擴(kuò)展文件。<expansion-version>

和第一次上傳該擴(kuò)展文件的APK文件的android:versionCode一致。后續(xù)版本的APK可以重用前面上傳的擴(kuò)展文件。

您程序的Java包名<package-name>

例如程序的版本為5,程序的包名為org.goodev.expansion.downloader。則上傳的main擴(kuò)展文件會(huì)被重命名為:

.goodev.expansion.downloader.obb三、擴(kuò)展文件的保存位置

當(dāng)AndroidMarket下載程序的擴(kuò)展文件的時(shí)候會(huì)保存到系統(tǒng)的共享存儲(chǔ)區(qū)。為了確保程序正常運(yùn)行,您不能刪除、移動(dòng)或者重命名擴(kuò)展文件。在某些設(shè)備上Market無(wú)法自動(dòng)下載該擴(kuò)展文件,那么您應(yīng)該在程序啟動(dòng)的時(shí)候去下載該文件并且保存到同樣的位置。

擴(kuò)展文件保存位置如下:

<shared-storage>/Android/obb/<package-name>/<shared-storage>

代表共享文件的目錄路徑,通過(guò)函數(shù)getExternalStorageDirectory()獲取;

<package-name>

APK的Java包名。

對(duì)于每個(gè)App而言,該目錄下最多只能包含2個(gè)擴(kuò)展文件。一個(gè)是main擴(kuò)展文件另外一個(gè)是patch擴(kuò)展文件。當(dāng)更新程序的時(shí)候,如果有新的擴(kuò)展文件則新文件會(huì)覆蓋舊的擴(kuò)展文件。

如果您需要解壓縮擴(kuò)展文件來(lái)使用,請(qǐng)注意不要?jiǎng)h除該.obb文件,并且也不要把文件解壓縮到該目錄。您應(yīng)該把解壓縮后的文件保存到getExternalFilesDir()返回的目錄下面。如果有可能的話,最好使用程序能直接讀取的文件格式而不用再次解壓縮文件了。Android開(kāi)發(fā)團(tuán)隊(duì)提供了一個(gè)項(xiàng)目(APKExpansionZipLibrary)可以直接讀取ZIP文件中的內(nèi)容而不用解壓縮該文件.

需要注意的是:保存在系統(tǒng)共享存儲(chǔ)區(qū)的文件,用戶和其他APP也可以訪問(wèn)。四、下載擴(kuò)展文件的流程

在大多數(shù)情況下,Market會(huì)在下載APK的同時(shí)去下載擴(kuò)展文件。然而,在某些情況下Market無(wú)法下載擴(kuò)展文件或者用戶刪除了以前下載的擴(kuò)展文件,您的程序需要處理這種異常情況。當(dāng)您的程序啟動(dòng)的時(shí)候,可以檢測(cè)文件是否存在并且可以從Market上下載。

開(kāi)發(fā)者檢查清單:

您可以通過(guò)下面的清單來(lái)檢查是否需要使用擴(kuò)展文件1.您的程序是否真的需要超過(guò)50MB的大小限制。在移動(dòng)設(shè)備上空間是非常寶貴的,您應(yīng)該盡可能減少App的大小。如果您僅僅是為了提供支持多種顯示設(shè)備的圖片資源的話,可以考慮使用發(fā)布多個(gè)APK的方式來(lái)減少每個(gè)APK的大小。2.判斷哪些數(shù)據(jù)需要打包為擴(kuò)展文件發(fā)布。3.在程序中添加訪問(wèn)共享存儲(chǔ)區(qū)中擴(kuò)展文件的代碼4.在程序的啟動(dòng)Activity中添加檢測(cè)擴(kuò)展文件是否存在,以及下載擴(kuò)展文件的代碼五、擴(kuò)展文件的規(guī)則和限制1.每個(gè)擴(kuò)展文件最大為2GB2.用戶必需要從AndroidMarket獲取您的程序才能自動(dòng)從Market中下載擴(kuò)展文件3.當(dāng)在您的程序中下載擴(kuò)展文件的時(shí)候,Market每次都會(huì)為每個(gè)文件生成一個(gè)唯一的下載URL,該URL會(huì)在短期內(nèi)失效。4.當(dāng)你上傳一個(gè)新的APK的時(shí)候,可以選擇使用以前上傳的擴(kuò)展文件5.如果您使用多個(gè)APK文件來(lái)適配不同的設(shè)備,并且也希望使用多個(gè)擴(kuò)展文件。為了獲取一個(gè)唯一的versionCode和不同的Marketfilter,您需要分別為每個(gè)設(shè)備上傳不同的APK文件。6.不能通過(guò)更新擴(kuò)展文件來(lái)發(fā)布一個(gè)新的版本。7.不要在obb/文件夾中保存其他數(shù)據(jù)8.不要?jiǎng)h除或者重命名.obb文件

六、APK擴(kuò)展文件使用實(shí)例

要在App中使用擴(kuò)展文件,需要兩個(gè)附加的Android庫(kù)項(xiàng)目:

1)GoogleMarketLicensingpackage

2)GoogleMarketAPKExpansionLibrarypackage

可以通過(guò)AndroidSDKManager來(lái)下載,也可以直接通過(guò)如下鏈接下載:

/android/repository/market_licensing-r02.zip

/android/repository/market_apk_expansion-r01.zip

下載完成后使用market_licensing-r02.zip文件中的目錄google_market_licensing\library來(lái)創(chuàng)建一個(gè)庫(kù)項(xiàng)目;然后使用market_apk_expansion-r01.zip中的google_market_apk_expansion\downloader_library來(lái)創(chuàng)建另外一個(gè)庫(kù)項(xiàng)目。同時(shí)為了簡(jiǎn)化對(duì)ZIP格式擴(kuò)展文件的處理,在market_apk_expansion-r01.zip文件中還包含了一個(gè)對(duì)ZIP文件處理的庫(kù)項(xiàng)目:google_market_apk_expansion\zip_file。如果您使用的擴(kuò)展文件格式是ZIP,那么也可以創(chuàng)建這個(gè)庫(kù)項(xiàng)目。

1.聲明需要的權(quán)限

1234567891011121314151617181920<manifest...>

<!--RequiredtoaccessAndroidMarketLicensing-->

<uses-permissionandroid:name="com.android.vending.CHECK_LICENSE"/>

<!--RequiredtodownloadfilesfromAndroidMarket-->

<uses-permissionandroid:name="android.permission.INTERNET"/>

<!--RequiredtokeepCPUalivewhiledownloadingfiles(NOTtokeepscreenawake)-->

<uses-permissionandroid:name="android.permission.WAKE_LOCK"/>

<!--Requiredtopollthestateofthenetworkconnectionandrespondtochanges-->

<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>

<!--RequiredtocheckwhetherWi-Fiisenabled-->

<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>

<!--Requiredtoreadandwritetheexpansionfilesonsharedstorage-->

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

...</manifest>

注意:默認(rèn)情況下,下載庫(kù)項(xiàng)目需要的APIlevel為4而APK擴(kuò)展ZIP庫(kù)項(xiàng)目需要APIlevel為5.

準(zhǔn)備工作完成后,下面來(lái)具體看看如何使用擴(kuò)展文件。2.實(shí)現(xiàn)下載服務(wù)(Implementingthedownloaderservice)

為了實(shí)現(xiàn)在后臺(tái)下載文件,下載庫(kù)項(xiàng)目提供了一個(gè)Service實(shí)現(xiàn),名稱為DownloaderService。您應(yīng)該繼承自這個(gè)文件來(lái)實(shí)現(xiàn)您的下載服務(wù)。為了簡(jiǎn)化下載服務(wù)的開(kāi)發(fā),該DownloaderService還實(shí)現(xiàn)了如下功能:注冊(cè)一個(gè)BroadcastReceiver來(lái)監(jiān)聽(tīng)設(shè)備的網(wǎng)絡(luò)連接狀態(tài)的改變。如果網(wǎng)絡(luò)連接斷開(kāi)就暫停下載;如果網(wǎng)絡(luò)連接恢復(fù)就繼續(xù)下載。安排一個(gè)RTC_WAKEUP通知,當(dāng)下載服務(wù)被終結(jié)的時(shí)候可以通過(guò)該通知來(lái)啟動(dòng)下載服務(wù)生成一個(gè)通知(Notification)來(lái)顯示下載的進(jìn)度以及下載錯(cuò)誤等狀態(tài)允許您的程序手工的暫停和恢復(fù)下載檢測(cè)共享存儲(chǔ)區(qū)掛載了并且可用,在下載文件之前檢測(cè)文件是否已經(jīng)存在、存儲(chǔ)空間是否足夠。如果出現(xiàn)問(wèn)題就通知用戶。

您僅僅需要?jiǎng)?chuàng)建一個(gè)繼承自DownloaderService的類,并且實(shí)現(xiàn)如下三個(gè)函數(shù)即可:

getPublicKey():您Market賬號(hào)的Base64編碼RSA公共密鑰,可以通過(guò)如下網(wǎng)址獲?。?/p>

/publish/Home#ProfileEditorPlace:getSALT():許可策略用來(lái)生成混淆器(Obfuscator)的一組隨機(jī)bytes。getAlarmReceiverClassName():返回您程序中用來(lái)重啟下載進(jìn)程的BroadcastReceiver類名稱。當(dāng)某些情況下,下載服務(wù)被意外終止的時(shí)候通過(guò)該BroadcastReceiver類來(lái)重新下載。比如進(jìn)程管理的程序終止了下載服務(wù)。下面是一個(gè)DownloaderService類的實(shí)現(xiàn)代碼:

1234567891011121314151617181920212223publicclassSampleDownloaderServiceextendsDownloaderService{

//Youmustusethepublickeybelongingtoyourpublisheraccount

publicstaticfinalStringBASE64_PUBLIC_KEY="YourAndroidMarketLVLKey";

//Youshouldalsomodifythissalt

publicstaticfinalbyte[]SALT=newbyte[]{1,42,-12,-1,54,98,

-100,-12,43,2,-8,-4,9,5,-106,-107,-33,45,-1,84

};

@Override

publicStringgetPublicKey(){

returnBASE64_PUBLIC_KEY;

}

@Override

publicbyte[]getSALT(){

returnSALT;

}

@Override

publicStringgetAlarmReceiverClassName(){

returnSampleAlarmReceiver.class.getName();

}}

然后在manifest文件中聲明該Service即可。非常簡(jiǎn)單吧!3.實(shí)現(xiàn)alarmreceiver

為了檢測(cè)下載進(jìn)程和重啟下載服務(wù),DownloaderService會(huì)安排一個(gè)RTC_WAKEUPAlarm來(lái)發(fā)送一個(gè)Intent到程序的BroadcastReceiver。你必需定義這個(gè)BroadcastReceiver來(lái)調(diào)用DownloaderLibrary提供的函數(shù),通過(guò)該函數(shù)來(lái)檢測(cè)下載狀態(tài)和在必要的情況下重啟下載服務(wù)。

實(shí)現(xiàn)這個(gè)類也是非常簡(jiǎn)單的,一般來(lái)說(shuō)只要覆寫(xiě)onReceive()函數(shù)并且調(diào)用DownloaderClientMarshaller.startDownloadServiceIfRequired()函數(shù)即可。如下所示:

1234567891011publicclassSampleAlarmReceiverextendsBroadcastReceiver{

@Override

publicvoidonReceive(Contextcontext,Intentintent){

try{

DownloaderClientMarshaller.startDownloadServiceIfRequired(context,intent,

SampleDownloaderService.class);

}catch(NameNotFoundExceptione){

e.printStackTrace();

}

}}

注意這個(gè)類的名字就是前面getAlarmReceiverClassName()函數(shù)返回的名稱。然后在manifest文件中聲明該receiver即可。同樣很簡(jiǎn)單吧!4.開(kāi)始下載擴(kuò)展文件程序的主Activity(通過(guò)Launcher圖標(biāo)啟動(dòng)的Activity)應(yīng)該負(fù)責(zé)檢查擴(kuò)展文件是否存在、如果不存在就啟動(dòng)下載服務(wù)。

使用DownloaderLibrary來(lái)下載需要遵守如下步驟:1)檢查文件是否已經(jīng)下載了

DownloaderLibrary中的Helper類中包含了一些函數(shù)來(lái)簡(jiǎn)化這個(gè)步驟:

getExtendedAPKFileName(Context,c,booleanmainFile,intversionCode)

doesFileExist(Contextc,StringfileName,longfileSize)

例如在示例項(xiàng)目中,在Activity的onCreate()函數(shù)中通過(guò)如下函數(shù)來(lái)檢查文件是否存在:

12345678booleanexpansionFilesDelivered(){

for(XAPKFilexf:xAPKS){

StringfileName=Helpers.getExpansionAPKFileName(this,xf.mIsBase,xf.mFileVersion);

if(!Helpers.doesFileExist(this,fileName,xf.mFileSize,false))

returnfalse;

}

returntrue;}這里的XAPKFile對(duì)象保存了已知擴(kuò)展文件的版本號(hào)和大小以及是否為main擴(kuò)展文件。如果該函數(shù)返回false則啟動(dòng)下載服務(wù)。2)通過(guò)DownloaderClientMarshaller.startDownloadServiceIfRequired(Contextc,PendingIntentnotificationClient,ClassserviceClass)該函數(shù)來(lái)開(kāi)始下載。

該函數(shù)的參數(shù)如下:

context:Yourapplication’sContext.

notificationClient:用來(lái)啟動(dòng)主Activity的PendingIntent。用在DownloaderService創(chuàng)建的用來(lái)顯示下載進(jìn)度的通知中。當(dāng)用戶選擇該通知,系統(tǒng)調(diào)用該P(yáng)endingIntent來(lái)打開(kāi)顯示下載進(jìn)度的Activity(一般而言就是啟動(dòng)下載的Activity)。

serviceClass:程序中繼承自DownloaderService的類。在必要的情況下會(huì)啟動(dòng)該服務(wù)來(lái)開(kāi)始下載。這個(gè)函數(shù)返回一個(gè)整數(shù)來(lái)表示是否有必要下載文件。有如下幾個(gè)值:NO_DOWNLOAD_REQUIRED:表示文件已經(jīng)存在或者當(dāng)前正在下載。LVL_CHECK_REQUIRED:表示需要授權(quán)驗(yàn)證來(lái)獲取下載擴(kuò)展文件的URL。DOWNLOAD_REQUIRED:表示擴(kuò)展文件的URL已經(jīng)獲取到了,但是還沒(méi)開(kāi)始下載。LVL_CHECK_REQUIRED和DOWNLOAD_REQUIRED在本質(zhì)上是一樣的,一般而言您無(wú)需關(guān)注這個(gè)狀態(tài)。在您的主Activity中調(diào)用startDownloadServiceIfRequired(),你只需要看看返回值是否為NO_DOWNLOAD_REQUIRED即可。如果返回值不是NO_DOWNLOAD_REQUIRED,DownloaderLibrary開(kāi)始啟動(dòng)下載,您應(yīng)該更新程序界面來(lái)顯示下載進(jìn)度;如果返回值是NO_DOWNLOAD_REQUIRED,表明該文件已經(jīng)下載好了,您的程序可以正常啟動(dòng)了。例如:

123456789101112131415161718192021222324@OverridepublicvoidonCreate(BundlesavedInstanceState){

//Checkifexpansionfilesareavailablebeforegoinganyfurther

if(!expansionFilesDelivered()){

//BuildanIntenttostartthisactivityfromtheNotification

IntentnotifierIntent=newIntent(this,MainActivity.getClass());

notifierIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|

Intent.FLAG_ACTIVITY_CLEAR_TOP);

...

PendingIntentpendingIntent=PendingIntent.getActivity(this,0,

notifierIntent,PendingIntent.FLAG_UPDATE_CURRENT);

//Startthedownloadservice(ifrequired)

intstartResult=DownloaderClientMarshaller.startDownloadServiceIfRequired(this,

pendingIntent,SampleDownloaderService.class);

//Ifdownloadhasstarted,initializethisactivitytoshowdownloadprogress

if(startResult!=DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED){

//Thisiswhereyoudosetuptodisplaythedownloadprogress(nextstep)

...

return;

}//Ifthedownloadwasn'tnecessary,fallthroughtostarttheapp

}

startApp();//Expansionfilesareavailable,starttheapp}3)當(dāng)startDownloadServiceIfRequired()函數(shù)的返回值不是NO_DOWNLOAD_REQUIRED的時(shí)候,調(diào)用DownloaderClientMarshaller.CreateStub(IDownloaderClientclient,ClassdownloaderService)函數(shù)來(lái)創(chuàng)建一個(gè)IStub實(shí)例。這個(gè)IStub實(shí)例提供了Activity和下載服務(wù)之前的綁定功能,這樣您的Activity就可以收到下載事件了。

CreateStub()函數(shù)需要一個(gè)實(shí)現(xiàn)了IDownloaderClient接口的類和DownloaderService的實(shí)現(xiàn)類作為參數(shù)。一般而言只要讓Activity實(shí)現(xiàn)IDownloaderClient接口即可。

Android開(kāi)發(fā)團(tuán)隊(duì)推薦在Activity的onCreate()函數(shù)中創(chuàng)建IStub對(duì)象(在startDownloadServiceIfRequired()函數(shù)之后創(chuàng)建)。例如:

123456789101112//Startthedownloadservice(ifrequired)intstartResult=DownloaderClientMarshaller.startDownloadServiceIfRequired(this,

pendingIntent,SampleDownloaderService.class);//Ifdownloadhasstarted,initializeactivitytoshowprogressif(startResult!=DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED){

//InstantiateamemberinstanceofIStub

mDownloaderClientStub=DownloaderClientMarshaller.CreateStub(this,

SampleDownloaderService.class);

//Inflatelayoutthatshowsdownloadprogress

setContentView(R.layout.downloader_ui);

return;}

當(dāng)onCreate()函數(shù)返回以后,Activity會(huì)執(zhí)行onResume()函數(shù),在該函數(shù)中調(diào)用IStub的connect()函數(shù)。同樣在onStop()函數(shù)中調(diào)用IStub的disconnect()函數(shù)。例如:

123456789101112131415@OverrideprotectedvoidonResume(){

if(null!=mDownloaderClientStub){

mDownloaderClientStub.connect(this);

}

super.onResume();}

@OverrideprotectedvoidonStop(){

if(null!=mDownloaderClientStub){

mDownloaderClientStub.disconnect(this);

}

super.onStop();}

調(diào)用connect()用來(lái)綁定Activity和DownloaderService。5.處理下載進(jìn)度

要接收下載進(jìn)度信息,需要實(shí)現(xiàn)IDownloaderClient接口。該接口有如下函數(shù):onServiceConnected(Messengerm)

在初始化完IStub后,會(huì)回調(diào)該函數(shù)。該函數(shù)的參數(shù)是用來(lái)訪問(wèn)您的DownloaderService的,通過(guò)DownloaderServiceMarshaller.CreateProxy()函數(shù)來(lái)創(chuàng)建這個(gè)IDownloaderService對(duì)象,然后可以用這個(gè)對(duì)象來(lái)控制下載服務(wù),比如暫停、繼續(xù)下載等。推薦的實(shí)現(xiàn)方式:

12345678privateIDownloaderServicemRemoteService;...

@OverridepublicvoidonServiceConnected(Messengerm){

mRemoteService=DownloaderServiceMarshaller.CreateProxy(m);

mRemoteService.onClientUpdated(mDownloaderClientStub.getMessenger());}

onDownloadStateChanged(intnewState)

當(dāng)下載狀態(tài)發(fā)生變化的時(shí)候調(diào)用該函數(shù),例如開(kāi)始下載或者下載完成。參數(shù)newState的值是IDownloaderClient接口中定義的一些常量之一(以STATE_開(kāi)頭的);

可以通過(guò)函數(shù)Helpers.getDownloaderStringResourceIDFromState()來(lái)獲取一個(gè)狀態(tài)的文本描述,這樣用戶更容易理解。例如STATE_PAUSED_ROAMING對(duì)應(yīng)的文本描述是:“Downloadpausedbecauseyouareroaming/當(dāng)前在漫游狀態(tài),下載停止”onDownloadProgress(DownloadProgressInfoprogress)

該函數(shù)的參數(shù)DownloadProgressInfo包含了下載進(jìn)度的各種信息,例如預(yù)計(jì)完成時(shí)間、當(dāng)前下載速度、完成的百分比等??梢愿鶕?jù)該信息來(lái)更新下載界面。另外還有一些有用的函數(shù):

requestPauseDownload()

暫停下載

requestContinueDownload()

恢復(fù)下載

setDownloadFlags(intflags)

設(shè)置下載的網(wǎng)絡(luò)標(biāo)示。當(dāng)前只支持一個(gè)標(biāo)示:FLAGS_DOWNLOAD_OVER_CELLULAR。通過(guò)移動(dòng)網(wǎng)絡(luò)下載擴(kuò)展文件。默認(rèn)情況下該標(biāo)示沒(méi)有啟用,所以默認(rèn)情況下只通過(guò)WIFI下載。6.讀取擴(kuò)展文件首先要獲取擴(kuò)展文件的路徑,可以通過(guò)如下代碼完成該操作:

1234567891011121314151617181920212223242526272829303132333435//ThesharedpathtoallappexpansionfilesprivatefinalstaticStringEXP_PATH="/Android/obb/";

staticString[]getAPKExpansionFiles(Contextctx,intmainVersion,intpatchVersion){

StringpackageName=ctx.getPackageName();

Vector<String>ret=newVector<String>();

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

//Buildthefullpathtotheapp'sexpansionfiles

Fileroot=Environment.getExternalStorageDirectory();

FileexpPath=newFile(root.toString()+EXP_PATH+packageName);

//Checkthatexpansionfilepathexists

if(expPath.exists()){

if(mainVersion>0){

StringstrMainPath=expPath+File.separator+"main."+

mainVersion+"."+packageName+".obb";

Filemain=newFile(strMainPath);

if(main.isFile()){

ret.add(strMainPath);

}

}

if(patchVersion>0){

StringstrPatchPath=expPath+File.separator+"patch."+

mainVersion+"."+packageName+".obb";

Filemain=newFile(strPatchPath);

if(main.isFile()){

ret.add(strPatchPath);

}

}

}

}

String[]retArray=newString[ret.size()];

ret.toArray(retArray);

returnretArray;}您可以在開(kāi)始下載的時(shí)候,把擴(kuò)展文件的版本號(hào)保存到SharedPreferences中,然后在這里使用。7.使用APKExpansionZipLibrary

APKExpansionZipLibrary項(xiàng)目包含了對(duì)ZIP文件的處理,您可以通過(guò)該項(xiàng)目提供的函數(shù)來(lái)直接讀取ZIP文件內(nèi)容而不用解壓縮擴(kuò)展文件,它把ZIP擴(kuò)展文件當(dāng)一個(gè)虛擬文件系統(tǒng)來(lái)使用。

APKExpansionZipLibrary項(xiàng)目包含如下類和函數(shù):

APKExpansionSupport

提供一些函數(shù)來(lái)訪問(wèn)擴(kuò)展文件名稱和ZIP文件。getAPKExpansionFiles()

返回?cái)U(kuò)展文件的文件路徑getAPKExpansionZipFile(Contextctx,intmainVersion,intpatchVersion)

返回一個(gè)包含main擴(kuò)展文件和patch擴(kuò)展文件的ZipResourceFile。如果您同時(shí)提供了mainVersion和patchVersion,則該函數(shù)返回main和patch擴(kuò)展文件的所有內(nèi)容,如果patch中的內(nèi)容和main中的有重復(fù),則使用patch的內(nèi)容覆蓋main中的內(nèi)容。ZipResourceFile

用來(lái)處理ZIP文件的類

getInputStream(StringassetPath)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論