如何使用java编写的PackageManager安装apk?
我有一个android应用程序,如果有新版本的apk,它可以从服务器上进行自我更新 问题是,它现在无法在运行安卓10及更高版本的设备上运行。问题的根本原因是ACTION_视图已被弃用,并且自android 10以来不再受支持。以下是不起作用的遗留代码:如何使用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
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软件包呢?据我所知,它也是不推荐的。