Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自我更新应用程序_Android_Apk_Updating_Self Updating - Fatal编程技术网

Android 自我更新应用程序

Android 自我更新应用程序,android,apk,updating,self-updating,Android,Apk,Updating,Self Updating,TL:DR;版本;) 我的应用程序应该在没有用户交互的情况下运行(autostart等工作) 它应该在没有任何用户交互的情况下(通过apk)自我更新 根设备是可能的 问题: 从服务器查询较新的apk有效 当以(查看?)意图启动apk时,“安装应用程序”提示弹出,需要用户确认 如何在没有任何用户交互的情况下解决此问题 这似乎是一个解决办法,但必须有更好的办法 我已经找到了这个: 但这并不能解决我的问题。我的建议是使用插件机制instad更新应用程序。您可以从Web动态加载类,并在应用程

TL:DR;版本;)

  • 我的应用程序应该在没有用户交互的情况下运行(autostart等工作)

  • 它应该在没有任何用户交互的情况下(通过apk)自我更新

  • 根设备是可能的

问题:

  • 从服务器查询较新的apk有效
  • 当以(查看?)意图启动apk时,“安装应用程序”提示弹出,需要用户确认
如何在没有任何用户交互的情况下解决此问题

这似乎是一个解决办法,但必须有更好的办法

我已经找到了这个:


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

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

解决了它!:D

它只在根设备中工作,但工作完美。 当以root用户身份执行时,使用unix cmd“pm”(packageManager)可以从SD卡安装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" />

如果
su-c
不起作用,请尝试
su0
(只有根设备才能执行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
        }
    }
}

好主意,我会尝试一下,但无论如何,我认为使用apk进行更新会更健壮,更不容易出错。没错,塞尔文,也许我应该尝试一下:……但是根设备方法呢?是否有可能在cmd上安装apk?它会给我错误代码139,即分段故障。但我的平板电脑已经扎根了。知道为什么吗?你能告诉我在根平板电脑上运行此代码需要什么权限吗?什么都没有发生。它没有给出任何错误,也没有安装apk。我的设备是根。你知道为什么它不工作吗?这在非根手机上可能吗?第一句话:“它只在根设备上工作…”,如前所述^^