查看安卓的源代码,installPackage被标记为弃用并检查安卓的PackageManager应用程序,它使用PackageInstaller类创建一个PackageInstaller.Session实例来执行APK的安装。
我正在尝试在我的应用程序中做同样的事情。我是用系统密钥签名的,并且我确实在清单中包含了INSTALL_PACKAGES权限。
下面是我的代码:
val packageName = "com.spotify.music"
val inputStream = File(filesDir, "spotify.apk").inputStream()
// ...
val packageInstaller = context.packageManager.packageInstaller
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName(packageName)
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)
val out = session.openWrite("COSU", 0, -1)
inputStream.copyTo(out)
session.fsync(out)
inputStream.close()
out.close()
session.commit(null)然而,我得到了以下奇怪的空指针异常:
Error while installing: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.AppOpsManager.checkPackage(int, java.lang.String)' on a null object reference
有谁知道这里出了什么问题吗?
发布于 2018-09-25 23:00:56
您不能将null传递给session.commit()。请参阅Android Developers上的文档。你需要的是一个IntentSender,它是你从PendingIntent得到的,它应该包含你的应用程序可以接收的意图(可以是Activity、Service或者BroadcastReceiver)。
当提交会话时,结果将作为额外内容包含在接收到的意图中。
发布于 2018-08-06 18:32:10
下面的代码片段应该适合您(我没有对其进行测试,但欢迎您对其进行调试和编辑任何必要的更改)。
方法参数:
APK上下文-应用程序的Context
代码如下:
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class PackageInstaller {
public static void installPackage(Context context, String installSessionId,
String packageName,
InputStream apkStream) throws IOException {
PackageManager packageManger = context.getPackageManager();
android.content.pm.PackageInstaller packageInstaller =
packageManger.getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
params.setAppPackageName(packageName);
android.content.pm.PackageInstaller.Session session = null;
try {
int sessionId = packageInstaller.createSession(params);
session = packageInstaller.openSession(sessionId);
OutputStream out = session.openWrite(installSessionId, 0, -1);
byte buffer[] = new byte[1024];
int length;
int count = 0;
while ((length = apkStream.read(buffer)) != -1) {
out.write(buffer, 0, length);
count += length;
}
session.fsync(out);
out.close();
Intent intent = new Intent(Intent.ACTION_PACKAGE_ADDED);
session.commit(PendingIntent.getBroadcast(context, sessionId,
intent, PendingIntent.FLAG_UPDATE_CURRENT).getIntentSender());
} finally {
if (session != null) {
session.close();
}
}
}
}https://stackoverflow.com/questions/51562940
复制相似问题