private fun openFile(file: File) { val intent = Intent(Intent.ACTION_VIEW).apply { setDataAndType(Uri.fromFile(file), "video/mp4") addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } startActivity(Intent.createChooser(intent, "Play Video")) }
private lateinit var binding: ActivityMainBinding
fun downloadVideo(url: String, fileName: String, onProgress: (Float) -> Unit, onComplete: (File?) -> Unit) { serviceScope.launch { try { startForegroundWithNotification() val request = Request.Builder().url(url).build() val response = client.newCall(request).execute() if (!response.isSuccessful) { withContext(Dispatchers.Main) { onComplete(null) } return@launch } val contentLength = response.body?.contentLength() ?: -1L val inputStream = response.body?.byteStream() val downloadsDir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) val outputFile = File(downloadsDir, "$fileName.mp4") FileOutputStream(outputFile).use { outputStream -> val buffer = ByteArray(8192) var bytesRead: Int var totalBytesRead = 0L while (inputStream?.read(buffer).also { bytesRead = it ?: -1 } != -1) { outputStream.write(buffer, 0, bytesRead) totalBytesRead += bytesRead if (contentLength > 0) { val progress = (totalBytesRead.toFloat() / contentLength) * 100 withContext(Dispatchers.Main) { onProgress(progress) updateNotification(progress.toInt()) } } } } inputStream?.close() withContext(Dispatchers.Main) { onComplete(outputFile) } stopForeground(false) } catch (e: Exception) { e.printStackTrace() withContext(Dispatchers.Main) { onComplete(null) } } } } download 4k video from youtube android
<com.google.android.material.textfield.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:hint="File name (optional)" android:layout_marginTop="8dp">
<com.google.android.material.button.MaterialButton android:id="@+id/btnDownload" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="Download Video" app:icon="@android:drawable/stat_sys_download" /> private fun openFile(file: File) { val intent =
private val permissionLauncher = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> val allGranted = permissions.values.all { it } if (allGranted) { startDownload() } else { Toast.makeText(this, "Storage permission required", Toast.LENGTH_SHORT).show() } }
data class SampleVideo(val name: String, val url: String) } <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> onProgress: (Float) ->
<com.google.android.material.textfield.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:hint="Video URL">