如何使用java编写的PackageManager安装apk?

如何使用java编写的PackageManager安装apk?,java,android,installation,apk,Java,Android,Installation,Apk,我有一个android应用程序,如果有新版本的apk,它可以从服务器上进行自我更新 问题是,它现在无法在运行安卓10及更高版本的设备上运行。问题的根本原因是ACTION_视图已被弃用,并且自android 10以来不再受支持。以下是不起作用的遗留代码: private void installapk(File file) { Log.w(TAG, "Installing new version..."); Intent intent = n

我有一个android应用程序,如果有新版本的apk,它可以从服务器上进行自我更新

问题是,它现在无法在运行安卓10及更高版本的设备上运行。问题的根本原因是ACTION_视图已被弃用,并且自android 10以来不再受支持。以下是不起作用的遗留代码:

  private void installapk(File file) {
        Log.w(TAG, "Installing new version...");
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        // Otherwise will throw exception, have to install it in new task
        intent.setFlags(intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
所以在搜索了一段时间之后,我剩下的唯一选择似乎是使用packagemanager类来完成这项工作。我发现了这个示例,它编译和运行时没有给出任何错误消息,但它似乎什么都没有做

 public static void install(Context context, String packageName, File file) {
        InputStream in = null;
        OutputStream out = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            PackageInstaller.Session session = null;
            try {
                in = new FileInputStream(file);

                PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
                PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                        PackageInstaller.SessionParams.MODE_FULL_INSTALL);
                //
                params.setAppPackageName(packageName);

                // set params
                int sessionId = packageInstaller.createSession(params);
                session = packageInstaller.openSession(sessionId);
                out = session.openWrite(file.getName(), 0, -1);
                final byte[] buffer = new byte[65536];
                int bytes_read;
                while((bytes_read = in.read(buffer)) != -1){
                    out.write(buffer, 0, bytes_read);
                }

                session.fsync(out);
                in.close();
                out.close();

                session.commit(createIntentSender(context, sessionId, ACTION_INSTALL_COMPLETE));
            } catch (IOException e) {
                Log.w(TAG, e.getMessage());
            } finally {

                ;
            }
        }
    } 


   private static IntentSender createIntentSender(Context context, int sessionId, String action) {
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, sessionId, new Intent(action), 0);
        return pendingIntent.getIntentSender();
    }

这段代码运行得很好,但正如我所说的,没有任何结果。我做错了什么?

关于ACTION\u INSTALL\u软件包呢?据我所知,它也是不推荐的。