If you are installing some other APK downloading through you application and want to remove if after successful install, follow me :-)
Step 1:
declare following permissions in your 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" />
Step 2: Register Receiver
<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>
Step 4:
In your Installer activity create a hash map like this, I have created in ApplicationMain
, it will differ according to implementation.
public static final ConcurrentHashMap<String, File> INSTALL_APK_INFO = new ConcurrentHashMap<String, File>();
and fill it with package name and file, where apk is put. You can get Pacakage name from any apk using this method
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;
}
}
Step 5: Now on your install receiver just do this
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();
}
Summary
1) create a hashmap and populate it with the APK package name and file. File is where exactly your APK is present.
Request to install 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) Register Package added, changed, install intents
3) On your receiver get the the package name that is installed from Intent
4) Get the file object from your hashmap and just call delete()