TL:DR;版本;)
。
问题:
当使用(?)启动apk时,
我如何在没有任何用户交互的情况下解决这个问题?
http://code.google.com/p/auto-update-apk-client/这似乎是一个解决方案,但必须有更好的方法。
我已经找到了这个:Install Application programmatically on Android
但这并不能解决我的问题。
发布于 2013-02-26 17:31:47
解决了!:D
它只适用于系统下的设备,但运行得非常完美。使用unix cmd "pm“(packageManager)允许您在以根用户身份执行时从sdcard安装apks。
希望这能在未来对一些人有所帮助。
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" />
发布于 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
发布于 2018-08-04 15:20:07
如果su -c
不起作用,试试su 0
(只有有根的设备才能执行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
}
}
}
https://stackoverflow.com/questions/14982174
复制相似问题