我正在尝试以编程方式安装应用程序而不提示。意味着,安装应用程序时不会显示弹出窗口,用户必须按安装选项。 我跟着THIS回答。 但每当我运行代码时,都会抛出错误
java.io.IOException:运行exec()时出错。命令:[su,-c,adb install -r /storage/emulated/0/update.apk]工作目录:null 环境:null
引起:java.io.IOException:权限被拒绝 在java.lang.ProcessManager.exec(本机方法) 在java.lang.ProcessManager.exec(ProcessManager.java:209)
它说权限被拒绝,但没有告诉哪个权限。 apk存储在设备中,我在清单中提供了以下权限。
q := datastore.NewQuery("Encounter").Filter("PatientID =", patientID).Order("CreatedDate").Order("-CreatedBy")
以下是我用于安装apk的代码
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
我把这个函数称为:
public 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();
}
}
}
有人可以帮助我获得我失踪的许可。
答案 0 :(得分:1)
您正在做的问题是,为了获得INSTALL_PACKAGES
权限,您的应用程序必须位于/ system / priv-app文件夹中。如果您的应用程序不在该文件夹中,那么您将不会被授予权限,您的应用程序将失败。
另一种以编程方式安装应用程序的方法,如果没有提示,假定您具有root访问权限,则如下所示:
首先,您必须将此权限添加到您的Android清单中。 <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
Android工作室可能会抱怨这是系统许可,但未获批准。不用担心,因为您的应用程序将安装到/ system / priv-app文件夹,它将只获得此系统的权限。
添加权限后,您可以使用以下静态方法来安装包。您需要做的就是提供一个可用于访问该文件的String
网址,并安装Context
并安装该应用程序。
public static boolean installPackage(final Context context, final String url)
throws IOException {
//Use an async task to run the install package method
AsyncTask<Void,Void,Void> task = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
try {
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
// set params
int sessionId = packageInstaller.createSession(params);
PackageInstaller.Session session = packageInstaller.openSession(sessionId);
OutputStream out = session.openWrite("COSU", 0, -1);
//get the input stream from the url
HttpsURLConnection apkConn = (HttpsURLConnection) new URL(url).openConnection();
InputStream in = apkConn.getInputStream();
byte[] buffer = new byte[65536];
int c;
while ((c = in.read(buffer)) != -1) {
out.write(buffer, 0, c);
}
session.fsync(out);
in.close();
out.close();
//you can replace this intent with whatever intent you want to be run when the applicaiton is finished installing
//I assume you have an activity called InstallComplete
Intent intent = new Intent(context, InstallComplete.class);
intent.putExtra("info", "somedata"); // for extra data if needed..
Random generator = new Random();
PendingIntent i = PendingIntent.getActivity(context, generator.nextInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
session.commit(i.getIntentSender());
} catch (Exception ex){
Log.e("AppStore","Error when installing application. Error is " + ex.getMessage());
}
return null;
}
};
task.execute(null,null);
return true;
}
注意:如果安装程序应用程序位于system / priv-app中,安装失败,请确保已使用发布密钥对应用程序进行了签名。有时使用调试密钥进行签名将阻止授予Install_Packages权限