【问题标题】:Delete an application (*.apk) after installation安装后删除应用程序 (*.apk)
【发布时间】:2013-04-13 05:20:32
【问题描述】:

我创建了一个 android 应用程序,并将其导出为 *.apk。是否可以让apk文件安装成功后自动删除?

【问题讨论】:

  • 从哪里删除 APK?
  • 来自 SD/磁盘。因为我将 APK 提供给我的朋友进行 beta 测试。
  • 但一些应用程序,如蓝牙应用程序发送者,他们再次获得了你的 apk。

标签: android apk android-install-apk


【解决方案1】:

如果您正在通过您的应用程序安装其他一些 APK 下载,并且在成功安装后想要删除,请关注我:-)

第 1 步: 在 AndroidManifest.xml 中声明以下权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_ADDED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />    
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_INSTALL" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />

第 2 步: 注册接收方

<receiver
            android:name="com.az.appstore.InstallReceiver"
            android:enabled="true" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_CHANGED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <action android:name="android.intent.action.PACKAGE_INSTALL" />


                <data android:scheme="package" />
            </intent-filter>
        </receiver>

第 4 步:

在您的安装程序活动中创建一个像这样的哈希映射,我在ApplicationMain 创建,它会根据实现而有所不同。

public static final ConcurrentHashMap<String, File> INSTALL_APK_INFO = new ConcurrentHashMap<String, File>();

并填写包名称和文件,其中放置了apk。您可以使用此方法从任何 apk 中获取 Pacakage 名称

public static String getPackageNameForAPK(final String archiveFilePath, Context context) {
        try {
            PackageInfo info = context.getPackageManager().getPackageArchiveInfo(archiveFilePath, PackageManager.GET_META_DATA);
            return info.packageName;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }

    }

第 5 步: 现在在您的安装接收器上执行此操作

if (action.equals(Intent.ACTION_PACKAGE_ADDED) || action.equals(Intent.ACTION_PACKAGE_CHANGED) || action.equals(Intent.ACTION_PACKAGE_INSTALL) || action.equals(Intent.ACTION_PACKAGE_REPLACED)) {
            ApplicationInfo info = null;
            try {
                info = context.getPackageManager().getApplicationInfo(intent.getDataString().split(":")[1], PackageManager.GET_META_DATA);
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (info != null) {
                    File file = ApplicationMain.INSTALL_APK_INFO.get(info.packageName);
                    if (file != null) {
                        file.delete();
                        ApplicationMain.INSTALL_APK_INFO.remove(info.packageName);
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }

总结

1) 创建一个 hashmap 并使用 APK 包名称和文件填充它。文件正是您的 APK 所在的位置。

请求安装 APK

public static void installUpdateAPK(Context context, String pathToAPK) {

        pathToAPK = pathToAPK.replace("file:///", "");

        final Intent intent = new Intent(Intent.ACTION_VIEW);
        File file = new File(pathToAPK);
        intent.setDataAndType(Uri.fromFile(file), APK_MIME_TYPE);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
        String name = getPackageNameForAPK(pathToAPK, context);

        if (name != null) {
            ApplicationMain.INSTALL_APK_INFO.put(name, file);
        }
    }

2) 注册包添加、更改、安装意图

3) 在您的接收器上获取从Intent 安装的包名称

4) 从哈希图中获取文件对象,然后调用 delete()

【讨论】:

  • 导入ApplicationMain的包是什么?我尝试搜索但找不到任何内容。
  • @thepace 请看“步骤 4” 你可以在任何类中声明这个地图,我已经在 ApplicationMain 中声明了它
  • 如果您还记得这一点,您知道为什么它在 Android 6 及以下版本上无法运行吗?
【解决方案2】:

安装完成后是否从设备的 SD 卡中删除 APK 无关紧要。即使可以在应用程序中编写这样的功能,任何拥有根设备的用户都将始终能够从/data/app/ 系统分区访问 APK。这实际上使您首先删除 APK 的努力无效。

话虽如此,您可以添加一个在第一次运行时删除 APK 的函数。由于 APK 几乎可以保存/存储在 sd 卡上的任何位置,我认为这些问题应该对您有所帮助。

要查找文件:Search entire sdcard for a specific file

找到文件后删除:How to delete a file from SD card?

【讨论】:

    【解决方案3】:

    如果您知道该 apk 在设备上的下载位置,那么您可以在您的应用首次运行时将其删除。如果它在 SD 卡上,则需要写入权限。

    但是,如果您不知道它的保存位置,那么您最多只能扫描设备以查找具有您给它的名称的 apk 文件并将其删除。

    此外,一旦安装,apk 就会被复制到内部存储中。任何拥有 root 设备的用户都可以恢复您的 apk。

    Beta 测试是一个信任问题。如果您不信任将 apk 提供给其进行测试的人,请不要将其提供给他们。

    【讨论】:

      【解决方案4】:

      当应用程序启动时,您可以手动检查 sdcard/download 文件夹(或其他可能保存 apk 的位置)。然后从那里删除。

      为避免在每次运行中搜索,您可以在共享首选项中存储 first_run 字段。默认情况下将字段设置为 true,并在第一次运行后将其设置为 false。这样你就可以检测到第一个runt

      【讨论】:

      • 从应用程序中您无法检测是否已安装。所以最好的方法是手动完成..查看我编辑的答案
      • 感谢您的建议...:)
      猜你喜欢
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多