Android 如何自动安装APK软件包
从下载管理器,我可以下载更新的APK。成功下载安装后,将弹出安装或取消窗口。 有没有办法在不要求安装的情况下安装APK。 因为如果我点击弹出窗口的外侧,弹出窗口就会关闭Android 如何自动安装APK软件包,android,android-intent,rooted-device,Android,Android Intent,Rooted Device,从下载管理器,我可以下载更新的APK。成功下载安装后,将弹出安装或取消窗口。 有没有办法在不要求安装的情况下安装APK。 因为如果我点击弹出窗口的外侧,弹出窗口就会关闭 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(path)),
"application/vnd.android.package-archive");
intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
不,出于安全原因,这是不可能的。您可以启动安装,但由用户决定 但是,如果手机是根用户,有一种方法可以通过编程实现,但这不是大多数应用程序的选项。代码与此类似:
public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException {
observer = new PackageInstallObserver();
pm = context.getPackageManager();
Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class};
Class<?>[] uninstalltypes = new Class[] {String.class, IPackageInstallObserver.class, int.class};
method = pm.getClass().getMethod("installPackage", types);
uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);
}
public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
uninstallmethod.invoke(pm, new Object[] {packagename, observer, 0});
}
public void installPackage(Uri apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
method.invoke(pm, new Object[] {apkFile, observer, INSTALL_REPLACE_EXISTING, null});
}
public static void installApp(Context context, File path, OnInstalledPackaged callback) {
try {
final ApplicationManager am = new ApplicationManager(context);
if(callback != null) am.setOnInstalledPackaged(callback);
am.installPackage(path);
} catch (Exception e) {
if(Utils.LOGGING) Utils.log("E::"+e.toString());
}
}
公共应用程序管理器(上下文)抛出SecurityException、NoSuchMethodException{
observer=新包installobserver();
pm=context.getPackageManager();
类[]类型=新类[]{Uri.Class,IPackageInstallObserver.Class,int.Class,String.Class};
类[]卸载类型=新类[]{String.Class,IPackageInstallObserver.Class,int.Class};
方法=pm.getClass().getMethod(“installPackage”,类型);
uninstallmethod=pm.getClass().getMethod(“deletePackage”,uninstalltypes);
}
public void卸载包(字符串packagename)抛出IllegalArgumentException、IllegalAccessException、InvocationTargetException{
调用(pm,新对象[]{packagename,observer,0});
}
public void installPackage(Uri apkFile)抛出IllegalArgumentException、IllegalAccessException、InvocationTargetException{
调用(pm,新对象[]{apkFile,observer,INSTALL\u REPLACE\u EXISTING,null});
}
详情如下:
不,出于安全原因,这是不可能的。您可以启动安装,但由用户决定 但是,如果手机是根用户,有一种方法可以通过编程实现,但这不是大多数应用程序的选项。代码与此类似:
public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException {
observer = new PackageInstallObserver();
pm = context.getPackageManager();
Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class};
Class<?>[] uninstalltypes = new Class[] {String.class, IPackageInstallObserver.class, int.class};
method = pm.getClass().getMethod("installPackage", types);
uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);
}
public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
uninstallmethod.invoke(pm, new Object[] {packagename, observer, 0});
}
public void installPackage(Uri apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
method.invoke(pm, new Object[] {apkFile, observer, INSTALL_REPLACE_EXISTING, null});
}
public static void installApp(Context context, File path, OnInstalledPackaged callback) {
try {
final ApplicationManager am = new ApplicationManager(context);
if(callback != null) am.setOnInstalledPackaged(callback);
am.installPackage(path);
} catch (Exception e) {
if(Utils.LOGGING) Utils.log("E::"+e.toString());
}
}
公共应用程序管理器(上下文)抛出SecurityException、NoSuchMethodException{
observer=新包installobserver();
pm=context.getPackageManager();
类[]类型=新类[]{Uri.Class,IPackageInstallObserver.Class,int.Class,String.Class};
类[]卸载类型=新类[]{String.Class,IPackageInstallObserver.Class,int.Class};
方法=pm.getClass().getMethod(“installPackage”,类型);
uninstallmethod=pm.getClass().getMethod(“deletePackage”,uninstalltypes);
}
public void卸载包(字符串packagename)抛出IllegalArgumentException、IllegalAccessException、InvocationTargetException{
调用(pm,新对象[]{packagename,observer,0});
}
public void installPackage(Uri apkFile)抛出IllegalArgumentException、IllegalAccessException、InvocationTargetException{
调用(pm,新对象[]{apkFile,observer,INSTALL\u REPLACE\u EXISTING,null});
}
详情如下:
通常,您需要将设备设置为根目录或具有系统固件签名 您可以在应用程序中创建
ApplicationManager
和OnInstalledPackaged
的副本
使用它,您可以运行类似以下内容:
public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException {
observer = new PackageInstallObserver();
pm = context.getPackageManager();
Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class};
Class<?>[] uninstalltypes = new Class[] {String.class, IPackageInstallObserver.class, int.class};
method = pm.getClass().getMethod("installPackage", types);
uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);
}
public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
uninstallmethod.invoke(pm, new Object[] {packagename, observer, 0});
}
public void installPackage(Uri apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
method.invoke(pm, new Object[] {apkFile, observer, INSTALL_REPLACE_EXISTING, null});
}
public static void installApp(Context context, File path, OnInstalledPackaged callback) {
try {
final ApplicationManager am = new ApplicationManager(context);
if(callback != null) am.setOnInstalledPackaged(callback);
am.installPackage(path);
} catch (Exception e) {
if(Utils.LOGGING) Utils.log("E::"+e.toString());
}
}
通常,您需要将设备设置为根目录或具有系统固件签名 您可以在应用程序中创建
ApplicationManager
和OnInstalledPackaged
的副本
使用它,您可以运行类似以下内容:
public ApplicationManager(Context context) throws SecurityException, NoSuchMethodException {
observer = new PackageInstallObserver();
pm = context.getPackageManager();
Class<?>[] types = new Class[] {Uri.class, IPackageInstallObserver.class, int.class, String.class};
Class<?>[] uninstalltypes = new Class[] {String.class, IPackageInstallObserver.class, int.class};
method = pm.getClass().getMethod("installPackage", types);
uninstallmethod = pm.getClass().getMethod("deletePackage", uninstalltypes);
}
public void uninstallPackage(String packagename) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
uninstallmethod.invoke(pm, new Object[] {packagename, observer, 0});
}
public void installPackage(Uri apkFile) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
method.invoke(pm, new Object[] {apkFile, observer, INSTALL_REPLACE_EXISTING, null});
}
public static void installApp(Context context, File path, OnInstalledPackaged callback) {
try {
final ApplicationManager am = new ApplicationManager(context);
if(callback != null) am.setOnInstalledPackaged(callback);
am.installPackage(path);
} catch (Exception e) {
if(Utils.LOGGING) Utils.log("E::"+e.toString());
}
}
您不能在没有用户交互的情况下安装apk,因为您的应用程序不是系统级的
但在三星设备中,如果您从三星获得Enterprise许可证,您可以静默安装和卸载应用程序没有用户交互,您就无法安装apk,因为您的应用程序不是系统级的
但在三星设备中,如果您从三星获得Enterprise许可证,您可以在下面的方法中以静默方式安装和卸载应用程序,在data/local上查找预定义标记,并尝试安装位于/system/preinstall目录中的apk文件(您可以更改) 在您的使用中,删除已安装的apks。下一次启动时,android将在预安装目录中安装apks
#!/system/bin/sh
MARK=/data/local/apks_installed
PKGS=/system/preinstall/
if [ ! -e $MARK ]; then
busybox find $PKGS -name "*\.apk" -exec sh /system/bin/pm install {} \;
touch $MARK
fi
添加一个在启动(init.d)脚本时运行的服务
编写一个blabla.sh文件并将其放入/system/bin/目录中
#!/system/bin/sh
MARK=/data/local/apks_installed
PKGS=/system/preinstall/
if [ ! -e $MARK ]; then
busybox find $PKGS -name "*\.apk" -exec sh /system/bin/pm install {} \;
touch $MARK
fi
注意:正如您可能意识到的,您还需要安装busybox
我可能犯了一些错误,但我认为您理解下面的要点。方法在data/local上查找预定义标记,并尝试安装/system/preinstall目录中的apk文件(您可以更改) 在您的使用中,删除已安装的apks。下一次启动时,android将在预安装目录中安装apks
#!/system/bin/sh
MARK=/data/local/apks_installed
PKGS=/system/preinstall/
if [ ! -e $MARK ]; then
busybox find $PKGS -name "*\.apk" -exec sh /system/bin/pm install {} \;
touch $MARK
fi
添加一个在启动(init.d)脚本时运行的服务
编写一个blabla.sh文件并将其放入/system/bin/目录中
#!/system/bin/sh
MARK=/data/local/apks_installed
PKGS=/system/preinstall/
if [ ! -e $MARK ]; then
busybox find $PKGS -name "*\.apk" -exec sh /system/bin/pm install {} \;
touch $MARK
fi
注意:正如您可能意识到的,您还需要安装busybox
我可能犯了一些错误,但我认为您理解这一点是的,您可以通过制作应用程序系统应用程序,然后运行命令pm install以静默方式安装apk,如下所示:
**private boolean installApk(String apkPath)
{
Command installEvent = new Command(getCommandList("pm install "
+ apkPath));
return installEvent.executeCommandList();
}**
这对我很有效。是的,您可以通过制作应用程序系统应用程序,然后运行命令pm install以静默方式安装apk,如下所示:
**private boolean installApk(String apkPath)
{
Command installEvent = new Command(getCommandList("pm install "
+ apkPath));
return installEvent.executeCommandList();
}**
这对我来说很有效。我只使用根电话。我只使用根电话。实际上,这并不能解决“向用户提示”的主要问题,而是在我有固件证书的设备上使用此代码。它安装时没有提示。@Knossos您如何获得固件证书?@Caner:您需要制作固件,或者知道制作固件的人并向他们索取。正如您刚才所说,这并不能解决问题,因为普通用户不愿意自己构建一个系统。实际上,这并不能解决“向用户提示”的主要问题,我在我有固件证书的设备上使用此代码。它在没有提示的情况下安装。@Knossos你怎么办