安装Android APK时不弹出提示

26

我们正在编写一个Android应用程序,在大屏幕上显示广告。 我们有一个后端,广告商可以选择广告,因此它们几乎可以即时更新。 由于将有许多运行的Android盒子(插入HDMI屏幕),我们应该能够远程更新我们的软件。

情况如下:

主应用程序持续运行(除非关闭),用户永远不会看到任何与Android相关的内容。 我们需要一个更新器应用程序来监听更新并删除主apk,安装新apk。 在更新期间,我们将显示一个活动界面,上面写着“正在更新,请等待”,直到新的主apk安装并显示出来。

我们需要什么:

我们需要帮助实现更新机制,而不会在已ROOT的设备上提示用户。

我们拥有什么:

更新器应用程序被挂接到启动接收事件中,其中一个服务开始运行(这个服务很快将由同事实现以监听更新)。 该服务可以启动一个活动界面,提示更新信息,同时进行更新。

在更新器活动界面中:

 try {
            Process proc = Runtime.getRuntime().exec(new String[]{"su", "pm install -r /mnt/sdcard/MYFOLDER/testAPK.apk"});
            stringBuilder.append(String.valueOf(proc.waitFor()));
            stringBuilder.append("\n");
        } catch (Exception e) {
            if (e instanceof IOException) {
                Log.d(TAG, "IOException");
            } else if (e instanceof InterruptedException) {
                Log.d(TAG, "InterruptedException");
            } else {
                e.printStackTrace();
            }
        }

StringBuilder打印11,但如果我给出随机不存在的命令,它也会打印11。

在清单文件中

<!-- Permission to start UpdaterService on boot -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<!-- Install/delete permissions, only granted to system apps -->
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />

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

如果我不将我的应用程序安装为系统应用程序,那么安装包和删除包都是无用的,这样说对吗?

长话短说,我没有安装我的测试APK,也不知道如何解决这个问题。任何帮助将不胜感激!


1
如果您拥有根访问权限,请将更新程序放置在/system/app/中,这样您就可以获得INSTALL_PACKAGES和DELETE_PACKAGES权限。 - nandeesh
2个回答

32

您可以使用adb install命令来静默安装/更新APK。以下是示例代码:

public static void InstallAPK(String filename){
    File file = new File(filename); 
    if(file.exists()){
        try {   
            String command;
            command = "adb install -r " + filename;
            Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
            proc.waitFor();
        } catch (Exception e) {
        e.printStackTrace();
        }
     }
  }

请查看 http://paulononaka.wordpress.com/2011/07/02/how-to-install-a-application-in-background-on-android/


9
没问题,我用"pm install"代替"adb install"就行了!谢谢! - TomCB
8
需要Root的设备!工作得非常好,su命令需要Root过的设备。 - Naveed Ahmad
@user7691120adb:获取apk版本的答案是“shell dumpsys package my.package | grep versionName”。关于如何知道最新的apk是否已安装以执行升级,可以详细说明一下吗? - Palak
@Palak,我收到以下错误信息:“无法运行程序“su”:错误=13,权限被拒绝”。 - Zdravko Donev
@Zdravko Donev:首先很抱歉回复晚了,请告诉我关于AndroidManifest.xml权限的情况。 - Palak
显示剩余4条评论

1
public void InstallAPK(String filename){

    Process process = Runtime.getRuntime().exec("su");
    OutputStream out = process.getOutputStream();
    String reinstall = "pm install -r " + filename + "\n";
    String am = "am start -a android.intent.action.MAIN -n yourPackage/.MainActivity";
    String cmd = reinstall + am + " &";
    out.write(cmd.getBytes());
    out.flush();
    out.close();
    process.waitFor();

}

安装工作正常,但应用程序无法重新启动... 请问您可以告诉我这是为什么吗?MainActivity 的路径是正确的... - asad.qazi

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