2

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

4

4 回答 4

9

如果您正在通过您的应用程序安装其他一些 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()

于 2014-03-05T08:56:01.417 回答
3

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

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

查找文件:在整个 sdcard 中搜索特定文件

找到文件后删除:如何从 SD 卡中删除文件?

于 2013-04-13T05:28:38.153 回答
2

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

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

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

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

于 2013-04-13T05:28:03.563 回答
-1

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

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

于 2013-04-13T05:23:58.980 回答