我们正在撰写一款在大屏幕上展示广告的Android应用。 我们有一个广告客户可以选择广告的后端,因此它们几乎可以立即更新。 因为会有很多Android盒子运行(插入HDMI屏幕),我们应该能够远程更新我们的软件。
情况如此:
主应用程序正在持续运行(除非关闭)并且用户从未看到任何与Android相关的内容。 我们需要一个更新程序应用程序来侦听更新并删除主apk,安装一个新的apk。 在更新时,我们将显示“正在更新,请稍候”的活动,直到新的主apk安装并显示。
我们需要什么:
我们需要有关如何实施更新机制的帮助,而不会在ROOTED DEVICE上提示用户。
我们拥有什么:
更新程序应用程序挂钩到启动服务启动的启动接收事件(此服务将侦听更新,这将很快由同事实施)。 该服务可以启动一个活动,该活动将在更新时提示更新信息。
在更新程序活动中
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,但如果我给出随机的现有命令,则会执行相同的操作。
在清单中
<!-- 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,我也不知道如何解决这个问题。 任何帮助,将不胜感激!
答案 0 :(得分:27)
您可以使用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/
答案 1 :(得分:0)
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();
}