我创建了一个Android应用程序,并将其导出为*.apk
。是否可以在成功安装后自动删除apk
文件?
答案 0 :(得分:7)
如果您正在通过您的应用程序安装其他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)从hashmap获取文件对象,然后调用delete()
答案 1 :(得分:3)
安装完成后,是否从设备的SD卡中删除了APK无关紧要。即使可以在应用程序中编写此类功能,任何拥有root设备的用户都始终能够从/data/app/
系统分区访问APK。这有效地使您无法首先删除APK。
话虽这么说,你可以添加一个在第一次运行时删除APK的功能。由于APK可以保存/存储在SD卡的任何位置,我认为这些问题应帮助您。
要查找文件:Search entire sdcard for a specific file
要在找到文件后删除该文件:How to delete a file from SD card?
答案 2 :(得分:1)
如果您知道在设备上下载apk的位置,那么您可以在首次运行应用时将其删除。如果它在SD卡上,您需要获得写入权限。
但是,如果您不知道它的保存位置,那么最多您必须扫描设备以获取具有您提供的名称的apk文件并将其删除。
此外,安装后,apks将被复制到内部存储。任何拥有root设备的用户都可以恢复你的apk。
Beta测试是一个值得信赖的问题。如果你不相信你要给apk进行测试的人,不要把它交给他们。
答案 3 :(得分:-1)
当应用程序启动时,您可以手动检查sdcard / download文件夹(或您可能保存apk的其他位置)。然后从那里删除它。
为避免在每次运行中搜索,您可以在共享首选项中存储first_run字段。默认情况下将字段设置为true,并在首次运行后将其设置为false。这样你就可以发现第一个小矮人