下載apk檔案在/data/data/packagename/files/目錄下,如何安裝成功
今天總結一下我們寫的程式需要更新(預設使用者已經安裝上舊版本了),而使用者更新時卻沒有sdcard的情況,如果有sdcard,那就不用廢話了。。。
先說一下軟體更新的基本原理,從伺服器下載一個程式的apk,然後啟動安裝,通常的情況下我們用到的都是在sdcard中操作,比如做些圖片快取或者記錄一些使用者的資訊之類的,而今天要總結的是在使用者沒有sdcard的情況下的做法。
1.擺在我們面前的第一個問題是沒有sdcard的情況下,我們應該把apk檔案下載到哪裡?哪裡可以下載?這是最重要的一個問題!
android是linux核心的系統,所以android也符合linux的規範,比如檔案的許可權
先說一下apk檔案可以放在哪兒?
答案是你的應用程式所在的目錄。
也許有些人不知道應用程式所在的目錄是哪個,很簡單,只需要在控制檯(或者eclipse自帶的DDMS中,當然DDMS不是所有的機型都可以看得到)下進入到/data/data/目錄下,然後輸入linux命令ls -al顯示的那些com.xxx之類的目錄,就是你手機上安裝的程式目錄啦!放個小圖。。。
而我這個工程的包名叫onerain.ha,所以,我剛才說的那個目錄就是/data/data/onerain.ha/目錄了!(這是linux的目錄,不是windows下的.字尾名的檔案)。
PS:如果你的機器是行貨,在沒有獲取root許可權時你是不能使用ls命令的,你只是不能更清楚的看到目錄所包含的檔案資訊,但是不會影響你的操作!
2.怎麼獲取這個目錄?
我這裡用了三種方式,所以會生成三個目錄,程式碼如下
1. /**
2. * 第一種方式可以放在android程式為我們提供的一個cache目錄中
3. */
4. File cacheDir = getCacheDir();
5. System.out.println(cacheDir.getPath());
6. /**
7. * 第二種方式我們可以自己建立一個目錄,
8. */
9. File dir = getDir("aaa"
10. System.out.println(dir.getPath());
11.
12. System.out.println(getPackageName());
13.
14. try
15. {
16. /**
17. * 第三章方式直接建立檔案,會放在/data/data/onerain.ha/files/下面
18. */
19. FileOutputStream fos = openFileOutput("test",
20. Context.MODE_PRIVATE | Context.MODE_WORLD_WRITEABLE | Context.MODE_WORLD_READABLE);
21. }
22. catch (FileNotFoundException e)
23. {
24. // TODO Auto-generated catch block
25. e.printStackTrace();
26. }
然後你的工程目錄就會變成這樣,截圖了
個人比較推薦第二種方式,原因是許可權,上圖中,只有app_aaa是對於其他使用者來說rwx許可權的(因為我們要在目錄下寫內容,即從伺服器下載之後寫流,所以這個w許可權是必須的,而你要進入到這個目錄下,x許可權也是必須的)!當然,如果你就是不想在這個目錄下寫也沒關係,許可權是可以修改的!
3.修改許可權
這個應該屬於linux的問題,當然也是很簡單的,命令列是這樣的
chmod [指令] [檔案/目錄]
指令簡單介紹下,linux下分為三種使用者,字母u代表擁有者(user),g代表擁有者所在的組(group),o代表其他使用者(other),a代表全部,而字母r代表可讀,w代表可寫,x代表可執行
如果要把某個檔案修改為對於所有使用者可讀可寫可執行,可以這樣寫指令
chmod a+rwx/data/data/oneran.ha/cache 當然也可以寫成 chmod ugo+rwx /data/data/onerain.ha/cache
當然還有一種用數字表示的方法,上述命令還可以這樣寫
chmod 777 /data/data/onerain.ha/cache
三位數字對應的是擁有者,擁有者所在的組,其他使用者,而rwx對應的值是421,如果是7說明是4+2+1即全許可權!
PS:扯遠了,其實也不遠,這裡介紹修改許可權不只是為了修改這個目錄,還要修改你下載的apk檔案的許可權,因為下載之後預設是不可執行的!!!
4.程式中修改許可權
在命令列中會修改許可權了,可是我們想要的是在程式中執行這些命令的功能啊!那如何呢?
我們下載的apk檔案是許可權不夠的,可以看下,程式碼+圖
[java]
1. File apkFile = new File(dir.getPath() + "/test.apk");
2. if(!apkFile.exists())
3. {
4. try {
5. apkFile.createNewFile();
6. } catch (IOException e) {
7. // TODO Auto-generated catch block
8. e.printStackTrace();
9. }
10. }
看到了吧,只有擁有者才有rw許可權。。。。坑爹吧!
所以我們的程式碼還要加上這句:
1. String[] command = {"chmod", "777", dir.getPath() + "/test.apk"};
2. ProcessBuilder builder = new ProcessBuilder(command);
3. try {
4. builder.start();
5. } catch (IOException e) {
6. // TODO Auto-generated catch block
7. e.printStackTrace();
8. }
再看圖吧,有圖有真相
看,我們的apk檔案的許可權,哈哈,成功了!剩下的工作就是啟動一個Intent去用android系統自帶的第三方安裝程式去安裝這個apk了,就會把之前的覆蓋掉了!因為是第三方的,所以o+x是必不可少的撒(即其他使用者有可執行的許可權)
注意:如果我們在data/data/package name/files/ 目錄下又建立了新目錄,然後把apk檔案放在該新目錄下。這個時候這個新目錄的許可權也要修改為777,不然只改apk檔案的許可權也是不行的。
原文地址:http://blog.csdn.net/onerain88/article/details/7035723