關於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. |
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. |
此時獲取到了輸入流 然後輸出就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. |
我為了獲取所有故這裡填"" 這時候得到幾個字串分別是images, sounds,webkit 當然你也可以放其他的檔案 也會被打印出來.
怎麼讀取檔案,獲取到檔案內容呢?先獲取上面說的獲取資料流。
open(String fileName) Open an asset using ACCESS_STREAMING mode. |
open(String fileName, int accessMode) |
關於那個開啟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
謝謝該連結的內容!