以编程方式安装新的apk文件显示错误

时间:2011-11-17 06:45:51

标签: android

我已经在我的应用程序的oncreate中放置了一个条件检查以检查版本更新。如果我的应用程序的新版本可用,我将调用onDestroy。

public void onCreate(Bundle savedInstanceState) {
    if(“true”.equal(CheckVersion))
    {
        alertbox.setMessage("Do you want to update Aplication with Latest version?");
        alertbox.setPositiveButton("Yes",
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {

                try {

                    onDestroy();
                } catch (Exception exception) {

                    exception.toString();
                }                       

            }
        });
        alertbox.setNegativeButton("No",
                new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                LaunchManifest();
            }
        });
        alertbox.show();
    }
}

/*
 * In the onDestroy method I have Placed the code for downloading the New
 * apk file and installation of the apk file methods as given below
 */
@Override
public void onDestroy() {
    DownloadOnSDcard();
    InstallApplication();
}

public void DownloadOnSDcard() {
    try {

        urlpath = "http://192.168.1.158/VisionEPODWebService/VisionEPOD.apk";
        String ApkName = "VisionEPOD.apk";

        URL url = new URL(urlpath.toString());
        // Your given URL.
        HttpURLConnection c = (HttpURLConnection)url.openConnection();
        c.setRequestMethod("GET");
        c.setDoOutput(true);
        c.connect();
        // Connection Complete here.!
        // Toast.makeText(getApplicationContext(),
        // "HttpURLConnection complete.", Toast.LENGTH_SHORT).show();
        String PATH = Environment.getExternalStorageDirectory() + "/download/";
        File file = new File(PATH); // PATH = /mnt/sdcard/download/
        if (!file.exists()) {
            file.mkdirs();
        }
        File outputFile = new File(file, ApkName.toString());
        FileOutputStream fos = new FileOutputStream(outputFile);
        // Toast.makeText(getApplicationContext(), "SD Card Path: " +
        // outputFile.toString(), Toast.LENGTH_SHORT).show();
        InputStream is = c.getInputStream();
        // Get from Server and Catch In Input Stream Object.
        byte[] buffer = new byte[1024];
        int len1 = 0;
        while ((len1 = is.read(buffer)) != -1) {
            fos.write(buffer, 0, len1); // Write In FileOutputStream.
        }
        fos.close();
        is.close();
        // till here, it works fine - .apk is download to my sdcard in
        // download file.
        // So plz Check in DDMS tab and Select your Emualtor.
        // Toast.makeText(getApplicationContext(),
        // "Download Complete on SD Card.!", Toast.LENGTH_SHORT).show();
        // download the APK to sdcard then fire the Intent.
    } catch (IOException e) {
        Toast.makeText(getApplicationContext(), "Error! " + e.toString(), Toast.LENGTH_LONG)
        .show();
    }
}

public void InstallApplication() {
    String ApkName = "VisionEPOD.apk";
    String PackageName = "com.Vision.EPOD";
    Uri packageURI = Uri.parse(PackageName.toString());
    Intent intent = new Intent(android.content.Intent.ACTION_VIEW, packageURI);
    intent.setDataAndType(
            Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/"
                    + ApkName.toString())), "application/vnd.android.package-archive");

    startActivity(intent);
}

问题是,当我的安装方法被执行时,它会显示一个警告框

替换申请 您正在安装的应用程序将替换另一个应用程序将保存所有以前的用户数据。 并有“确定”和“取消”按钮

当我点击“确定”按钮时,它会显示另一个用于安装应用程序的按钮

但是当我点击“安装”按钮时,应用程序会显示一个显示安装的进度条

然后我会得到一个没有安装完成按钮的消息应用程序。

即我的新更新未安装。

这是我实施版本更新程序的正确方法吗?请问任何人。请查看冗长的代码。

1 个答案:

答案 0 :(得分:2)

这很可能是因为您首先从Eclipse在您的设备上安装应用程序。这样做会使用一个证书对您的应用进行签名。

然后你将.apk文件放在某个位置 - 制作这个.apk文件,你必须用证书签名。

Eclipse为您的应用程序签名的证书与您使用.apk文件签署的证书不同 - 这意味着当您下载.apk文件并尝试安装它时,将出现证书不匹配的情况不会安装。

你能做的是:

  1. 通过设备上的.apk文件安装应用
  2. 创建.apk文件的较新版本并将其放在网上。
  3. 在设备上运行应用,更新应该会成功。