如何在没有提示的情况下以编程方式安装android app,

时间:2018-05-22 08:13:31

标签: android android-activity android-manifest android-install-apk

我正在尝试以编程方式安装应用程序而不提示。意味着,安装应用程序时不会显示弹出窗口,用户必须按安装选项。 我跟着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();
        }
    }
}

有人可以帮助我获得我失踪的许可。

1 个答案:

答案 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权限