2

这个问题可能早有人问过,但没有得到任何明确的答案。我基本上不希望和客户端交互更新和其他东西,他们所能看到的只是应用程序正在运行并且他们很高兴。但为此,我需要一些后台线程或检查市场是否有新更新并在后面更新它并在应用更新后重新启动应用程序的东西。

PS我对android开发完全陌生,如果我听起来很疯狂,真的很抱歉,但这是我的要求

4

2 回答 2

3

您无法在没有用户交互的情况下更新(或安装)应用程序,除非

  1. 你是一个系统应用程序(自定义 ROM)
  2. 您的设备已获得 root 权限,并且您的更新程序具有 root 权限。

此外,没有可用于检查 Google Play 商店中可用应用程序版本的官方 API。

您可以通过跟踪 Google Play 之外的当前版本,然后通过启动市场链接提示更新用户来实现您正在尝试做的一些事情。如果您从辅助应用程序执行此操作,您甚至可以等待更新完成,然后重新启动该应用程序。

在实践中,您不能在没有用户交互的情况下进行静默安装/更新,这是一件好事(tm),因为前几位评论者已经说明了原因。

于 2013-03-13T02:12:28.277 回答
3

AFAIK,如果你有 root 访问权限是可能的,过程如下:

  1. 您的应用位于/system/app文件夹中(作为系统应用)
  2. 您需要以下权限:

    android.permission.INSTALL_PACKAGES
    android.permission.DELETE_PACKAGES
    android.permission.CLEAR_APP_CACHE
    android.permission.WRITE_EXTERNAL_STORAGE
    android.permission.MOUNT_UNMOUNT_FILESYSTEMS
    
  3. 您的应用必须使用系统签名进行签名

    java -jar signapk.jar platform.x509.pem platform.pk8 helloworld.apk hello.apk
    
  4. 检查后台线程中的更新并将更新的 .apk 文件下载到临时位置,例如apk_path

  5. 以编程方式执行pm install apk_path命令,下面是一个片段:

    public String silentInstallation(String apkPath)
    {
            String[] args = { "pm", "install", "-r", apkPath };             
            ProcessBuilder processBuilder = new ProcessBuilder(args);  
            Process process = null;  
            InputStream errIs = null;  
            InputStream inIs = null;  
            try {  
                ByteArrayOutputStream baos = new ByteArrayOutputStream();  
                int read = -1;  
                process = processBuilder.start();  
                errIs = process.getErrorStream();  
                while ((read = errIs.read()) != -1) {  
                    baos.write(read);  
                }  
                baos.write('\n');  
                inIs = process.getInputStream();  
                while ((read = inIs.read()) != -1) {  
                    baos.write(read);  
                }  
                byte[] data = baos.toByteArray();  
                result = new String(data);  
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                try {  
                    if (errIs != null) {  
                        errIs.close();  
                    }  
                    if (inIs != null) {  
                        inIs.close();  
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
                if (process != null) {  
                    process.destroy();  
                }  
            }  
            return result;  
    }
    

希望能帮助到你。

于 2013-03-13T02:10:07.850 回答