很多手機游戲,在安裝APK之后都得需要下載相應的資源包,然后才能進入游戲。
有這樣一個需求:就是游戲中需要的資源包打在APK內,隨apk一起進行安裝到手機中。
這樣就不需要,在安裝APK之后,去下載資源。(這樣APK的大小就會大一些)
於是在網上就開始找對應的直接訪問隨apk一起安裝到手機中的資源。比如在assets目錄下放置了一個“test.zip”的資源。當apk安裝之后,可能我就需要訪問這個"test.zip"資源文件。(可能我會去解壓到某處)
在網上找了很長時間,說什么在assets下的資源怎么怎么不能超過1M、或者要分成多個不超過1M的小文件,然后用的時候在拼成一個大文件、說什么要用到什么數據庫。總之說的,感覺沒有一個有用的。
於是自己就實現了一個從assets下拷貝資源到sd卡中的一個功能。這里不限制非得拷貝到sd卡中。
之所以要拷貝出來,是因為在assets內的資源隨apk安裝之后,不好訪問。所以想拷貝到一個容易訪問的地方。比如是一個assets下的是一個zip文件,為需要在安裝之后進行解壓。而解壓的時候我又想使用 ant.jar (支持編碼) 。於是我先將zip資源拷貝到一個地方,然后在進行解壓。
下面代碼:
private void copyBigDataToSD(String strOutFileName) throws IOException { InputStream myInput; OutputStream myOutput = new FileOutputStream(strOutFileName); myInput = this.getAssets().open("yphone.zip"); byte[] buffer = new byte[1024]; int length = myInput.read(buffer); while(length > 0) { myOutput.write(buffer, 0, length); length = myInput.read(buffer); } myOutput.flush(); myInput.close(); myOutput.close(); }
備注:參數為要拷貝的目的地例如“/mnt/sdcard/test/Out.zip”;
此處“myInput = cGameActivity.getAssets().open("yphone.zip"); ”open 的是你放在assets下的資源的名稱。本例放的是一個叫"yphone.zip"的文件;
在進行測試的時候發現在資源文件很大時,例如200M左右,可能會報錯。
但可以保證的是100M一下的沒問題。
最后,此函數運行需要加權限!
