getPackageManager().setInstallerPackage("<device.owner.package.name>", "<installer.package.name>");
PackageInstaller
来准备升级:PackageInstaller pi = getPackageManager().getPackageInstaller();
int sessId = pi.createSession(new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL));
PackageInstaller.Session session = pi.openSession(sessId);
OutputStream out = session.openWrite("app");
// .. write updated APK file to out
session.fsync(out);
session.commit(...);
session.close();
通过NFC为设备所有者应用程序进行配送,就像您已经做的那样。
在Play商店上提供更新版本(相同的软件包名称、相同的签名、更高的版本号)的设备所有者应用程序。
在您的设备上的Play商店应用程序中,搜索您的应用程序的Play商店版本并安装更新。
在Play商店中激活设备所有者应用程序的自动更新(在应用程序的Play商店页面上,点击菜单(三个点),并激活自动更新的复选框)。
虽然这需要一些配置工作,但设备应该会自动接收未来的更新。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
startActivity(intent);
fileName
是您在SD卡上新apk文件的路径。
我偶然发现了这个问题,并想补充一下评论中链接的答案已经得到扩展,只要您的应用程序是设备所有者,就可以静默安装该应用程序:
https://dev59.com/O18d5IYBdhLWcg3wYhaX#37153867
以下是Android 6.0及以上版本中的相关部分: 一旦您的应用程序获取设备所有者权限,我们就可以在没有任何用户干预的情况下进行静默安装、卸载和更新。
public 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);
// 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();
}
卸载:
String appPackage = "com.your.app.package";
Intent intent = new Intent(getActivity(), getActivity().getClass());
PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0);
PackageInstaller mPackageInstaller = getActivity().getPackageManager().getPackageInstaller();
mPackageInstaller.uninstall(appPackage, sender.getIntentSender());
我猜你可能想成为EMM/MDM合作伙伴应用程序-它类似于设备所有者应用程序,但具有增强的特权和API。通常像三星/HTC这样的OEM会为MDM合作伙伴应用程序提供隐藏的API以升级应用程序。我不确定Android for Work是否也提供此API。
例如:OEM提供了一个名为updatePackage(String packageName)的API,可以由设备上的MDM客户端使用来更新包。您可以使用此API来更新设备所有者应用程序。