隨筆-1  評(píng)論-68  文章-98  trackbacks-0

          作者:徐建祥(netpirate@gmail.com)
          日期:2010/07/28
          網(wǎng)址:http://www.anymobile.org

           

          安裝程序:軟件從無(wú)到有。

          卸載程序:軟件從有到無(wú)。

          更新程序:軟件的覆蓋安裝,可以保留原版本的數(shù)據(jù),提升軟件版本。

           

          安裝程序的方法:

           

          1、  通過(guò)Intent機(jī)制,調(diào)出系統(tǒng)安裝應(yīng)用,重新安裝應(yīng)用的話,會(huì)保留原應(yīng)用的數(shù)據(jù)。

           

          String fileName = Environment.getExternalStorageDirectory() + apkName;

          Uri uri = Uri.fromFile(new File(fileName));

          Intent intent = new Intent(Intent.ACTION_VIEW);

          intent.setDataAndType(Uri, application/vnd.android.package-archive");

          startActivity(intent);

           

          2、  直接調(diào)用安裝接口。

           

          Uri mPackageURI = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + apkName));

          int installFlags = 0;

          PackageManager pm = getPackageManager();

          try

          {

              PackageInfo pi = pm.getPackageInfo(packageName,

              PackageManager.GET_UNINSTALLED_PACKAGES);

              if(pi != null)

              {

                  installFlags |= PackageManager.REPLACE_EXISTING_PACKAGE;

              }

          }

          catch (NameNotFoundException e)

          {}

          PackageInstallObserver observer = new PackageInstallObserver();

          pm.installPackage(mPackageURI, observer, installFlags);

           

          安裝應(yīng)用權(quán)限:android.permission.INSTALL_PACKAGES

           

          系統(tǒng)應(yīng)用(安裝在/system/app下面)可以采用該方式,第三方應(yīng)用無(wú)法申請(qǐng)安裝卸載權(quán)限。

          java.lang.SecurityException: Neither user 10039 nor current process has android.permission.INSTALL_PACKAGES.

           

          3、  執(zhí)行install命令。

           

          install –r 更新安裝,默認(rèn)新安裝;如果不附上-r參數(shù),則會(huì)清楚原應(yīng)用的數(shù)據(jù),版本一致則無(wú)法安裝。

          1am start …

          2Runtime.exec(String[] args)

          3Class<?> execClass = Class.forName("android.os.Exec");

           

          4、  執(zhí)行cp / adb push命令。

           

          由系統(tǒng)檢測(cè)到應(yīng)用程序有更新,自動(dòng)完成重新安裝。

           

          5、  通過(guò)第三方軟件實(shí)現(xiàn)。

           

          MarketEOEeTrackDog均采用第一種方法實(shí)現(xiàn)更新。

          優(yōu)點(diǎn):由系統(tǒng)核心應(yīng)用程序控制安裝程序;

          缺點(diǎn):無(wú)法控制安裝過(guò)程;安裝完成后,也無(wú)法立刻啟動(dòng)應(yīng)用,需要用戶確認(rèn);無(wú)法擴(kuò)展。

           

          實(shí)例:Market查找安裝程序

          Intent intent =

          new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:your.app.id"));

          startActivity(intent);

           

          卸載程序的方法:

           

          1、  通過(guò)Intent機(jī)制,調(diào)出系統(tǒng)卸載應(yīng)用。

          Uri packageURI = Uri.parse("package: your.app.id");

          Intent intent = new Intent(Intent.ACTION_DELETE);

          startActivity(intent);

           

          2、  直接調(diào)用卸載接口。

           

          PackageInstallObserver observer = new PackageInstallObserver();

          pm.installPackage(mPackageURI, observer, installFlags);

           

          卸載應(yīng)用權(quán)限:android.permission.DELETE_PACKAGES

           

          3、  運(yùn)行rm apk安裝文件,由系統(tǒng)檢測(cè)后調(diào)用卸載應(yīng)用。

           

          備注說(shuō)明:

          Android系統(tǒng)的應(yīng)用安裝,在系統(tǒng)設(shè)置里面有一項(xiàng),是否安裝未知源,所在在軟件更新的時(shí)候,需要檢測(cè)這個(gè)選項(xiàng),如果打鉤,則只允許安裝Market源提供的安裝程序,如果沒(méi)有打鉤的話,系統(tǒng)安裝應(yīng)用時(shí)會(huì)提示用戶設(shè)置,如果選擇設(shè)置,設(shè)置好后,無(wú)法返回安裝界面;如果選擇取消,則推出安裝程序。所以,如果是更新的話,一定要在下載之前就檢測(cè)許可安裝源的設(shè)置,或者在下載前檢測(cè)是否已經(jīng)下載過(guò)新的安裝程序,避免重復(fù)下載安裝程序。

           

          相關(guān)的代碼如下:

          1.          int result = Settings.Secure.getInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS, 0);      

          2.          if (result == 0) {      

          3.          // show some dialog here      

          4.          // ...      

          5.          // and may be show application settings dialog manually      

          6.          Intent intent = new Intent();      

          7.          intent.setAction(Settings.ACTION_APPLICATION_SETTINGS);      

          8.          startActivity(intent);     

          9.          }

           

          public static final class Settings.Secure extends Settings.NameValueTable

          public static final String INSTALL_NON_MARKET_APPS

          Since: API Level 3

          Whether the package installer should allow installation of apps downloaded from sources other than the Android Market (vending machine). 1 = allow installing from other sources 0 = only allow installing from the Android Market

           

          下面是程序更新的幾個(gè)步驟演示:





          OVER!

          posted on 2010-08-10 14:00 Xu Jianxiang 閱讀(19497) 評(píng)論(6)  編輯  收藏 所屬分類(lèi): Android

          評(píng)論:
          # re: Android 程序的安裝、卸載和更新 2010-11-09 22:23 | Tal
          你好 我現(xiàn)在想做一個(gè)電子市場(chǎng)

          我想知道里面的程序如何檢測(cè)到是否有新版本需要升級(jí)呢??

          望回復(fù)!

          QQ:386367781  回復(fù)  更多評(píng)論
            
          # re: Android 程序的安裝、卸載和更新[未登錄](méi) 2010-11-18 15:34 | 新手
          你好
          上述代碼我在android中調(diào)試了一下
          存在以下問(wèn)題,還望指點(diǎn)下
          1:PackageInstallObserver observer = new PackageInstallObserver();

          中PackageInstallObserver 這個(gè)類(lèi)是你自己寫(xiě)的嗎?我在SDK中找不到,若是你自己寫(xiě)的。還望把代碼再發(fā)下
          2:pm.installPackage(mPackageURI, observer, installFlags);

          中的installPackage方法在SDK中找不到

          十分著急,望盡快 回復(fù),不勝感激~~~~  回復(fù)  更多評(píng)論
            
          # re: Android 程序的安裝、卸載和更新 2010-12-14 22:23 | Xu Jianxiang
          @Tal

          market需要自行處理版本檢測(cè)相關(guān);新的sdk,google market添加了該機(jī)制,只有market支持,第三方的market均需要自行實(shí)現(xiàn)。  回復(fù)  更多評(píng)論
            
          # re: Android 程序的安裝、卸載和更新 2010-12-14 22:25 | Xu Jianxiang
          @新手
          這個(gè)是系統(tǒng)類(lèi),sdk屏蔽了該類(lèi),用引用它,必須在完整api的基礎(chǔ)上開(kāi)發(fā);所以第三方的應(yīng)用,建議還是用Intent機(jī)制實(shí)現(xiàn)之。  回復(fù)  更多評(píng)論
            
          # re: Android 程序的安裝、卸載和更新 2011-03-03 15:03 | wu
          packageName想請(qǐng)問(wèn)一下 這東西是哪獲取的  回復(fù)  更多評(píng)論
            
          # re: Android 程序的安裝、卸載和更新 2012-09-02 14:37 | 一個(gè)新手
          最后那段代碼您有具體實(shí)現(xiàn)的代碼或者能指點(diǎn)我一下嗎?看不大懂。。。。。謝謝
          QQ:195310723
            回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 芷江| 宜城市| 新巴尔虎右旗| 赤峰市| 富顺县| 新化县| 邳州市| 鄂伦春自治旗| 疏附县| 宜阳县| 哈尔滨市| 贞丰县| 裕民县| 建平县| 大田县| 涞水县| 晋江市| 宣武区| 大洼县| 沾化县| 无锡市| 新民市| 吴忠市| 县级市| 玛纳斯县| 兴业县| 繁昌县| 朝阳市| 广安市| 安阳县| 乡宁县| 万山特区| 上蔡县| 西畴县| 兰溪市| 玛沁县| 佳木斯市| 全椒县| 上蔡县| 甘孜| 郸城县|