1. 程式人生 > >關於android 如何安裝 assets檔案下的apk

關於android 如何安裝 assets檔案下的apk

本來來源於為了得分回答別人的問題,不詳細思考,不驗證,就把百度的答案貼上去,所以在此,先道歉http://bbs.csdn.net/topics/390432635。

留有問題,當沒有SD卡又不知道內部儲存路徑時,這時候我本打算將APK 存到

/data/data/<packagename>/files/xxx.apk 該位置,然後安裝,然後刪除。但是出現問題,出現解析錯誤,我試過chmod 777 來給予許可權了依然有問題。等待解答。

那下載安裝,下載路徑有是怎麼一種情況,又是如何安裝的呢?有待於學習。

執行該示例程式碼的可能出現問題,就在檔名和路徑名那裡。如果有問題,請更改這兩處。

本文中的所有程式碼都經過本人驗證。

從整體上看,一般的對於assets 裡面的apk進行安裝的操作是先將 apk 複製到sd上 或者其他的可讀取儲存位置。比如我拿到的機子 有兩個路徑

 /mnt/emmc/ 手機的內部儲存位置(其他的手機不一定有)

 /mnt/sdcard/ 手機的sd儲存位置

 複製到這兩個路徑都OK。

首先要獲取assets目錄下檔案的資料流,用於寫到儲存位置上。

//這裡的fileName 這個是assets檔案下的全檔名 包括字尾名。

path 是儲存的路徑位置,絕對路徑。

InputStream is = context.getAssets().open(fileName);
File file = new File(path);
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = is.read(temp)) > 0) {
fos.write(temp, 0, i);
}
fos.close();
is.close();

通過Context 獲取到AssetManager

() Return an AssetManager instance for your application's package.
在Google sdk 上如此解釋 返回一個 AssetManager
open(String fileName) Open an asset using ACCESS_STREAMING mode.
open(String fileName, int accessMode) Open an asset using an explicit access mode, returning an InputStream to read its contents.
AssetManager 有著兩種方式獲取到InputStream 第二種帶入accessMode 是對 訪問許可權控制的

此時獲取到了輸入流 然後輸出就OK,注意close 沒其他的問題。 一會回頭詳細分析這個AssetManager。

這裡所謂的安裝就是開啟apk 百度有很多答案,我給出一個我測試通過的程式碼

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://" + Environment.getExternalStorageDirectory().getAbsolutePath()+"/test.apk"),
 "application/vnd.android.package-archive");
mContext.startActivity(intent);

我在下面提供整體的程式碼


注意在manifest中新增你的sd許可權<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

現在分析一下這個 AssetManager 類。

為了分析這個類,先介紹一下assets這個資料夾

Android 系統為每個新設計的程式提供了/assets目錄,這個目錄儲存的檔案可以打包在程式裡。/res 和/assets的不同點是,android不為/assets下的檔案生成ID。如果使用/assets下的檔案,需要指定檔案的路徑和檔名(是全名)

下面寫一個方法遍歷assets下面的全部檔案

AssetManager  mAssetManager= getAssets();
String[] files = null;
try {
files = mAssetManager.list("");//為什麼是空呢
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(String temp:files) Log.v("shenwenjian",""+temp);

list(String path) Return a String array of all the assets at the given path.
返回一個包含在assets中給定路徑的所有檔案 陣列,

我為了獲取所有故這裡填"" 這時候得到幾個字串分別是images, sounds,webkit 當然你也可以放其他的檔案 也會被打印出來.

 怎麼讀取檔案,獲取到檔案內容呢?先獲取上面說的獲取資料流。

open(String fileName) Open an asset using ACCESS_STREAMING mode.
open(String fileName, int accessMode)
通過這兩個方法就可獲取到輸入流,然後通過 ByteArrayOutputStream 將inputstream 轉換成string 即可以看到檔案內容

關於那個開啟APK的還需要分析。

主要就是解析那個intent 和策略等

這裡給定一個apk安裝,解除安裝和更新的連線。

http://blog.csdn.net/netpirate/article/details/5801379

http://www.devdiv.com/Android-%E5%A6%82%E4%BD%95%E6%89%93%E5%BC%80assets%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E7%9A%84apk_-thread-38839-1-1.html

謝謝該連結的內容!