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