How to Install and Uninstall packages in Kotlin
this topic shows how to install and uninstall packages using the package manager in Kotlin.
//This function is used to initiate the download of an APK file from a specified URL
fun Download(ppp: String) {
currentTimestamp = System.currentTimeMillis().toString()
val fileName = "$currentTimestamp.apk" // Generate a unique file name
Log.d("filename",fileName.toString())
val downloadmanager: DownloadManager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
val uri = Uri.parse(ppp)
val request = DownloadManager.Request(uri)
// creates a request to download the file, Set the destination directory and file name
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS,
fileName
)
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); // Tell on which network you want to download file.
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // This will show notification on top when downloading the file.
request.setTitle("Downloading data..."); // Title for notification.
request.setVisibleInDownloadsUi(true);
registerReceiver(onComplete, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
request.addRequestHeader("Authorization", "bearer my bearertoken")
val dm = downloadmanager.enqueue(request);
Log.d("dm", dm.toString())
}
//BroadcastReceiver listens for the completion of the download.
var onComplete: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(ctxt: Context, intent: Intent) {
// Do Something
installAPK()
Toast.makeText(applicationContext, "Completed Download", Toast.LENGTH_LONG).show()
}
}
//This function is responsible for installing the downloaded APK file
fun installAPK() {
val PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
.toString() + "/" + currentTimestamp.toString() + ".apk"//Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString()+"/1690437624964.apk"
val file = File(PATH)
if (file.exists()) {
val apkUri = uriFromFile(applicationContext, file)
val intent = Intent(Intent.ACTION_VIEW)
intent.setDataAndType(
apkUri,
"application/vnd.android.package-archive"
)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
try {
applicationContext.startActivity(intent)
} catch (e: ActivityNotFoundException) {
e.printStackTrace()
Log.e("TAG", "Error in opening the file!")
}
} else {
Toast.makeText(applicationContext, "File Does not Exists!", Toast.LENGTH_LONG).show()
}
}
companion object {
private const val UNINSTALL_REQUEST_CODE = 1
const val RESULT_REFRESH = 1
}
fun uriFromFile(context: Context?, file: File?): Uri? {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
FileProvider.getUriForFile(
context!!, BuildConfig.APPLICATION_ID + ".provider",
file!!
)
} else {
Uri.fromFile(file)
}
}
//This function initiates the uninstallation of an app given its package name.
fun uninstallApp(packageName: String) {
val uri = Uri.parse("package:$packageName")
val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE, uri)
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true)
try {
startActivityForResult(intent, UNINSTALL_REQUEST_CODE)
} catch (e: ActivityNotFoundException) {
e.printStackTrace()
Log.e("TAG", "Error in uninstalling the app!")
}
}
//this functions checks whether application installed or not,
//if installed it returns true else it returns false
private fun appInstalledOrNot(packageName: String): Boolean {
val pm = packageManager
return try {
pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)
true // Package is installed
} catch (e: PackageManager.NameNotFoundException) {
false // Package is not installed
}
}