我正在使用以下类通过我的代码安装其他应用程序:
android.content.pm.IPackageDeleteObserver
android.content.pm.IPackageInstallObserver
考虑到Google链接link1,link2和link3,我的应用程序正在根据目标API 27进行编译
我相信,如果某个应用程序使用的是目标API级别的灰色列表中的私有API,那么它们将对该应用程序列入黑名单。
现在,我正在使用的API已添加到API 28的灰色列表中,但是只要我具有目标API级别27,我就可以使用它们。
问题是,如果我移到目标API 28,这些API将被列入我的应用黑名单。
我的问题是,是否还有其他人面临同样的问题,以及是否有解决方案?
我也已经在Google问题跟踪器中举了票,但是很久以来,注意事项也一直在更新。
答案 0 :(得分:0)
我在API 28中使用android.content.pm也遇到了同样的问题。我能够使用以下功能来安装软件包:
val ACTION_INSTALL_COMPLETE = "com.example.myinstallexample.INSTALL_COMPLETE"
fun installPackage(file: File) {
val pi = Application.instance.applicationContext.getPackageManager().getPackageInstaller()
val sessionId =
pi.createSession(PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL))
val session = pi.openSession(sessionId)
var sizeBytes: Long = 0
if (file.isFile()) {
sizeBytes = file.length();
}
var input: InputStream? = null
var out: OutputStream? = null
input = FileInputStream(file.path)
out = session.openWrite("app_store_session", 0, sizeBytes);
var total = 0
val buffer = ByteArray(65536)
var len: Int
while(input.read(buffer).also { len = it } != -1) {
total += len;
out.write(buffer, 0, len);
}
session.fsync(out);
input.close()
out.close();
val broadCastTest = PendingIntent.getBroadcast(
Application.instance.applicationContext,
sessionId,
Intent(ACTION_INSTALL_COMPLETE),
PendingIntent.FLAG_UPDATE_CURRENT
)
session.commit(broadCastTest.getIntentSender());
session.close();
}
答案 1 :(得分:0)
Maximiliano Gonzalez的答案在转换为Java代码并以uuid系统作为系统应用程序(作为固件的一部分)构建时实际上可以工作。这是代码:
private void installPackage(File file) throws IOException {
PackageInstaller pi = getApplicationContext().getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams sp = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
int sessionId = pi.createSession(sp);
PackageInstaller.Session session = pi.openSession(sessionId);
long sizeBytes = 0;
if (file.isFile()) {
sizeBytes = file.length();
}
InputStream input;
OutputStream out;
input = new FileInputStream(file.getPath());
out = session.openWrite("app_store_session", 0, sizeBytes);
long total = 0;
byte[] buffer = new byte[65536];
int len;
do {
len = input.read(buffer);
if (len != -1) {
total += len;
out.write(buffer, 0, len);
}
} while (len != -1);
session.fsync(out);
input.close();
out.close();
PendingIntent broadCastTest = PendingIntent.getBroadcast(getApplicationContext(),
sessionId, new Intent(ACTION_INSTALL_COMPLETE),
PendingIntent.FLAG_UPDATE_CURRENT);
session.commit(broadCastTest.getIntentSender());
session.close();
}