Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 以编程方式安装apk并省略安装对话框_Android_Android Tv - Fatal编程技术网

Android 以编程方式安装apk并省略安装对话框

Android 以编程方式安装apk并省略安装对话框,android,android-tv,Android,Android Tv,我们有一个应用程序目录,在我们的主应用程序中,我们希望用户显示我们提供的所有其他应用程序,并能够让他们安装这些应用程序-,而无需通过Google Play store 流程将是: 在我们的主应用程序中选择一个应用程序 APK是从远程服务器(https)下载的 安装APK APK被打开了 到目前为止,我们基本上已经能够完成上述所有步骤。 但是,我们仍然从下载的APK本身获得安装提示 有没有办法跳过此安装提示 有没有什么方法可以说“给我们下载和安装更多APK的权利”,而用户不需要做任何事情

我们有一个应用程序目录,在我们的主应用程序中,我们希望用户显示我们提供的所有其他应用程序,并能够让他们安装这些应用程序-,而无需通过Google Play store

流程将是:

  • 在我们的主应用程序中选择一个应用程序
  • APK是从远程服务器(https)下载的
  • 安装APK
  • APK被打开了
到目前为止,我们基本上已经能够完成上述所有步骤。 但是,我们仍然从下载的APK本身获得安装提示

  • 有没有办法跳过此安装提示
  • 有没有什么方法可以说“给我们下载和安装更多APK的权利”,而用户不需要做任何事情
安装APK的代码如下所示:

final File file = new File(apkPath);
Uri uri = FileProvider.getUriForFile(this, AUTHORITY + ".provider", file);

Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
startActivityForResult(intent, REQUEST_CODE_INSTALLED);
Android权限:

 <uses-permission android:name="android.permission.INTERNET"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
我们知道存在安全限制,但我们的解决方案将针对某些合作伙伴,他们可以为我们提供系统签名的apk。然而,我们尝试了一个系统签名的APK,我们仍然得到了安装提示

仅供参考:我们的应用程序在AndroidTV上运行


谢谢大家!

要实现这一点,你的应用程序(Launcher或你用来安装其他应用程序的应用程序)应该是“设备所有者”,我猜是这样的。或者它应该安装在系统目录中才能使用此权限

您需要在清单中添加此权限

<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
其中中的是您的InputFileSeream对象

要将文件转换为InputFileStream,请执行以下操作

new FileInputStream(apk_file)
    PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
    PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
            PackageInstaller.SessionParams.MODE_FULL_INSTALL);
    params.setAppPackageName(packageName);
    // set params
    try {
        int sessionId = packageInstaller.createSession(params);
        PackageInstaller.Session session = packageInstaller.openSession(sessionId);
        OutputStream out = session.openWrite("COSU", 0, -1);
        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();

        session.commit(createIntentSender(context, sessionId));
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
new FileInputStream(apk_file)