Android 如何自动安装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

从下载管理器,我可以下载更新的APK。成功下载安装后,将弹出安装或取消窗口。 有没有办法在不要求安装的情况下安装APK。 因为如果我点击弹出窗口的外侧,弹出窗口就会关闭

 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你怎么办