1. 程式人生 > >下載apk檔案在/data/data/packagename/files/目錄下,如何安裝成功

下載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"

, Context.MODE_PRIVATE | Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);  

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