无需询问用户即可更新Android应用程序

时间:2010-12-07 18:27:19

标签: android

我正在构建一个Android应用程序,并想知道是否有办法自动更新此应用程序而无需请求用户的权限...

此应用程序将在运行Android的专用平板电脑中作为独立应用程序运行,其中一项所需功能是能够从应用程序连接的服务器自动更新此应用程序...

有没有办法做到这一点?

非常感谢...

5 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

通常无法在用户未通过确认对话框的情况下更新应用,因为用户被视为设备所有者并且需要他们的主动同意。

但是,如果它是一个专用设备,并且你有能力重新刷新固件,你可以修改android平台以允许它。

如果确认对话框没问题(实际上,为什么不应该?),您可以启用第三方应用并使用安装包意图,或者将浏览器发送到托管您应用的网页mime类型等...

答案 2 :(得分:0)

安装完成后,您可以手动进入市场并允许应用自动更新。但是,如果任何权限发生更改,则必须手动完成更新。

答案 3 :(得分:0)

听起来这不是一个运往市场的应用程序?如果可以确保设备已植根,则可以非常轻松地执行静默更新。

答案 4 :(得分:0)

是的,您可以通过这种方式实现应用程序的自我更新。虽然,对于这个答案,我将假设您可以完全访问设备A.K.A root access。

快速摘要是,您可以使用PackageInstaller api结合INSTALL_PACKAGES权限自行更新您的应用程序,只要新的apk使用与当前安装的密钥相同的密钥进行签名。

以下是说明:

首先,您必须将此权限添加到您的Android清单中。 <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> Android工作室可能会抱怨这是系统许可,不会被授予。不用担心,因为您的应用程序将安装到/ system / priv-app文件夹,它将仅获得此系统的权限。

添加权限后,您可以使用以下静态方法来安装包。您需要做的就是提供一个可用于访问该文件的String网址,并安装Context并安装该应用程序。

 public static boolean installPackage(final Context context, final String url)
        throws IOException {
    //Use an async task to run the install package method
    AsyncTask<Void,Void,Void> task = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... voids) {
            try {
                PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
                PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                        PackageInstaller.SessionParams.MODE_FULL_INSTALL);

                // set params
                int sessionId = packageInstaller.createSession(params);
                PackageInstaller.Session session = packageInstaller.openSession(sessionId);
                OutputStream out = session.openWrite("COSU", 0, -1);
                //get the input stream from the url
                HttpsURLConnection apkConn = (HttpsURLConnection) new URL(url).openConnection();
                InputStream in = apkConn.getInputStream();
                byte[] buffer = new byte[65536];
                int c;
                while ((c = in.read(buffer)) != -1) {
                    out.write(buffer, 0, c);
                }
                session.fsync(out);
                in.close();
                out.close();
                //you can replace this intent with whatever intent you want to be run when the applicaiton is finished installing
                //I assume you have an activity called InstallComplete
                Intent intent = new Intent(context, InstallComplete.class);
                intent.putExtra("info", "somedata");  // for extra data if needed..
                Random generator = new Random();
                PendingIntent i = PendingIntent.getActivity(context, generator.nextInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
                session.commit(i.getIntentSender());
            } catch (Exception ex){
                Log.e("AppStore","Error when installing application. Error is " + ex.getMessage());
            }

            return null;
        }
    };
   task.execute(null,null);
    return true;
}

注意:如果安装程序应用程序位于system / priv-app中,安装失败,请确保已使用发布密钥对应用程序进行了签名。有时使用调试密钥进行签名将阻止授予Install_Packages权限