首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >自我更新应用程序

自我更新应用程序
EN

Stack Overflow用户
提问于 2013-02-20 22:23:36
回答 3查看 15.7K关注 0票数 23

TL:DR;版本;)

  • 我的应用程序应该在没有用户交互的情况下运行(自动启动等工作)
  • 它应该在没有任何用户的情况下自我更新(通过apk)设备是可能的

问题:

当使用(?)启动apk时,

  • 从服务器查询较新的apk会影响
  • 。意图时,将弹出“安装应用程序”提示,并需要用户confirmation

我如何在没有任何用户交互的情况下解决这个问题?

http://code.google.com/p/auto-update-apk-client/这似乎是一个解决方案,但必须有更好的方法。

我已经找到了这个:Install Application programmatically on Android

但这并不能解决我的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-26 17:31:47

解决了!:D

它只适用于系统下的设备,但运行得非常完美。使用unix cmd "pm“(packageManager)允许您在以根用户身份执行时从sdcard安装apks。

希望这能在未来对一些人有所帮助。

代码语言:javascript
复制
public static void installNewApk()
{
        try
        {
            Runtime.getRuntime().exec(new String[] {"su", "-c", "pm install -r /mnt/internal/Download/fp.apk"});
        }
        catch (IOException e)
        {
            System.out.println(e.toString());
            System.out.println("no root");
        }
}

所需权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
票数 36
EN

Stack Overflow用户

发布于 2013-02-20 22:33:25

我的建议是使用插件机制来更新应用程序。您可以从Web动态加载类,并在您的应用程序中运行它们,而无需任何用户交互。互联网上有很多资源:

How to load a Java class dynamically on android/dalvik?

http://android-developers.blogspot.com/2011/07/custom-class-loading-in-dalvik.html

票数 5
EN

Stack Overflow用户

发布于 2018-08-04 15:20:07

如果su -c不起作用,试试su 0 (只有有根的设备才能执行su!)

完整的答案看起来像这样:

代码语言:javascript
复制
private void installNewApk()
    {
        String path = mContext.getFilesDir().getAbsolutePath() + "/" + LOCAL_FILENAME;
        mQuickLog.logD("Install at: " + path);
        ProcessUtils.runProcessNoException(mQuickLog, "su", "0", "pm", "install", "-r", path);
    }

定义了这个类后:

代码语言:javascript
复制
public class ProcessUtils {
    Process process;
    int errCode;
    public ProcessUtils(String ...command) throws IOException, InterruptedException{
        ProcessBuilder pb = new ProcessBuilder(command);
        this.process = pb.start();
        this.errCode = this.process.waitFor();
    }

    public int getErrCode() {
        return errCode;
    }

    public String getOutput() throws IOException {
        InputStream inputStream = process.getInputStream();
        InputStream errStream = process.getErrorStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line + System.getProperty("line.separator"));
        }

        br = new BufferedReader(new InputStreamReader(errStream));
        while ((line = br.readLine()) != null) {
            sb.append(line + System.getProperty("line.separator"));
        }
        return sb.toString();
    }


    public static String runProcess(String ...command) throws IOException, InterruptedException {
        ProcessUtils p = new ProcessUtils(command);
        if (p.getErrCode() != 0) {
            // err
        }
        return p.getOutput();
    }

    public static void runProcessNoException(String ...command) {
        try {
            runProcess(command);
        } catch (InterruptedException | IOException e) {
            // err
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14982174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档