我创建了一个 android 应用程序,并将其导出为*.apk
. 是否可以apk
在安装成功后自动删除文件?
4 回答
如果您正在通过您的应用程序安装其他一些 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()
安装完成后是否从设备的 SD 卡中删除 APK 无关紧要。即使可以在应用程序中编写这样的功能,任何拥有根设备的用户都将始终能够从/data/app/
系统分区访问 APK。这实际上使您首先删除 APK 的努力无效。
话虽如此,您可以添加一个在第一次运行时删除 APK 的函数。由于 APK 可以保存/存储在 sd 卡上的任何位置,我认为这些问题应该对您有所帮助。
查找文件:在整个 sdcard 中搜索特定文件
找到文件后删除:如何从 SD 卡中删除文件?
如果您知道该 apk 在设备上的下载位置,那么您可以在您的应用首次运行时将其删除。如果它在 SD 卡上,则需要写入权限。
但是,如果您不知道它的保存位置,那么您最多只能扫描设备以查找具有您给它的名称的 apk 文件并将其删除。
此外,一旦安装,apk 就会被复制到内部存储中。任何拥有 root 设备的用户都可以恢复您的 apk。
Beta 测试是一个信任问题。如果您不信任将 apk 提供给进行测试的人,请不要将其提供给他们。
当应用程序启动时,您可以手动检查 sdcard/download 文件夹(或其他可能保存 apk 的位置)。然后从那里删除。
为了避免在每次运行中搜索,您可以在共享首选项中存储 first_run 字段。默认情况下将字段设置为 true,并在第一次运行后将其设置为 false。这样你就可以检测到第一个 runt