自动更新应用程序

24

简短概述:

  • 我的应用程序应该在没有用户操作的情况下运行(自动启动等)

  • 它应该通过apk更新而无需任何用户交互

  • 可以使用已root设备

.

问题:

  • 从服务器查询新版apk可行
  • 当使用(视图?)意图启动apk时,“安装应用程序”提示弹出并需要用户确认

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

http://code.google.com/p/auto-update-apk-client/看起来是一个解决方案,但肯定有更好的方法。

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

但那不能解决我的问题。

3个回答

37
我解决了! :D
它只适用于已root的设备,但完美地运行。 使用Unix命令“pm”(packageManager)允许您在以root身份执行时从sdcard安装apk。
希望这可以帮助一些人在未来。
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");
        }
}

所需权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

它给我返回错误代码139,即分段错误。但我的平板电脑已经被root了。有任何想法为什么会这样? - jeevs
请问您能告诉我在已root的平板电脑上运行此代码需要哪些权限吗? - jeevs
什么也没发生。既没有出现任何错误,也没有安装apk。我的设备已经root了。有任何想法为什么它不起作用? - Santosh Prasad Sah
据我所知,非root设备无法实现。此外,这段代码在我尝试的每个apk上都可以1:1地运行。也许你的路径不对?你的异常是什么? - Thkru
如果应用程序正在播放,而您尝试运行更新,会发生什么?它会重新启动、崩溃还是其他什么情况?另一个问题是...这段代码是在我们要更新的应用程序中,还是在其他将更新我的应用程序中? - NixSam
显示剩余3条评论

5

好主意,我会试一下,但是无论如何,我认为使用apk进行更新会更加健壮和不容易出错。 - Thkru
没错Selvin,也许我真的应该尝试一下这个:http://code.google.com/p/auto-update-apk-client/ ...但是关于root设备的方法呢?有没有可能在cmd上安装apk? - Thkru

0
如果su -c无法使用,请尝试su 0(只有已经root的设备才能使用su!)
完整答案如下:
private void installNewApk()
    {
        String path = mContext.getFilesDir().getAbsolutePath() + "/" + LOCAL_FILENAME;
        mQuickLog.logD("Install at: " + path);
        ProcessUtils.runProcessNoException(mQuickLog, "su", "0", "pm", "install", "-r", path);
    }

有了这个类的定义:

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
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接