I have been trying to make an Android system application to automatically install an apk. It was working fine in Marshmallow.
My application is platform signed and android.uid.system.
Here is the code:
private static boolean installPackage(Context context, InputStream in, String packageName)
throws IOException {
PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
PackageInstaller.SessionParams.MODE_FULL_INSTALL);
params.setAppPackageName(packageName);
logg("extra: " + Intent.EXTRA_REFERRER);
params.setReferrerUri(Uri.parse(Intent.EXTRA_REFERRER));
params.setOriginatingUri(Uri.parse(Intent.EXTRA_ORIGINATING_URI));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
params.setOriginatingUid(1000);
}
// set params
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));
return true;
}
private static IntentSender createIntentSender(Context context, int sessionId) {
PendingIntent pendingIntent = PendingIntent.getBroadcast(
context,
sessionId,
new Intent(ACTION_INSTALL_COMPLETE),
0);
return pendingIntent.getIntentSender();
}