android 程序更新(沒有sdcard) – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

今天總結一下我們寫的程序需要更新(默認用戶已經安裝上舊版本瞭),而用戶更新時卻沒有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.怎麼獲取這個目錄?

 

我這裡用瞭三種方式,所以會生成三個目錄,代碼如下

<span style="font-size:18px;">/**

         * 第一種方式可以放在android程序為我們提供的一個cache目錄中

         */ 

        File cacheDir = getCacheDir(); 

        System.out.println(cacheDir.getPath()); 

        /**

         * 第二種方式我們可以自己創建一個目錄,

        */ 

        File dir = getDir("aaa", Context.MODE_PRIVATE | Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE); 

        System.out.println(dir.getPath()); 

 

        System.out.println(getPackageName()); 

         

        try  

        { 

            /**

             * 第三章方式直接創建文件,會放在/data/data/onerain.ha/files/下面

             */ 

            FileOutputStream fos = openFileOutput("test",  

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

    }  

        catch (FileNotFoundException e)  

        { 

            // TODO Auto-generated catch block 

            e.printStackTrace(); 

    }</span> 

 

然後你的工程目錄就會變成這樣,截圖瞭

個人比較推薦第二種方式,原因是權限,上圖中,隻有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文件是權限不夠的,可以看下,代碼+圖

<span style="font-size:18px;">File apkFile = new File(dir.getPath() + "/test.apk"); 

        if(!apkFile.exists()) 

        { 

            try { 

                apkFile.createNewFile(); 

            } catch (IOException e) { 

                // TODO Auto-generated catch block 

                e.printStackTrace(); 

            } 

        }</span> 

 

看到瞭吧,隻有擁有者才有rw權限。。。。坑爹吧!所以我們的代碼還要加上這句

<span style="font-size:18px;">        String[] command = {"chmod", "777", dir.getPath() + "/test.apk"}; 

        ProcessBuilder builder = new ProcessBuilder(command); 

        try { 

            builder.start(); 

        } catch (IOException e) { 

            // TODO Auto-generated catch block 

            e.printStackTrace(); 

        } 

</span> 

 

再看圖吧,有圖有真相

 

看,我們的apk文件的權限,哈哈,成功瞭!剩下的工作就是啟動一個Intent去用android系統自帶的第三方安裝程序去安裝這個apk瞭,就會把之前的覆蓋掉瞭!因為是第三方的,所以o+x是必不可少的撒(即其他用戶有可執行的權限)

也可以這樣操作的,不是隻有root過的水貨機才能做的呀!

 

摘自 oneRain88的專欄

發佈留言