Penggunaan DownloadManager pada Webview

Assalamualaikum Warahmatullahi Wabarakatuh. Pada pembahasan kali ini kita akan membuat sebuah program agar webesite/blog yang terdapat pada webview tersebut bisa mendownload sebuah file dari link server, contohnya file dengan format mp4, mp3, mkv, 3gp, dll..

Penggunaan DownloadManager pada Webview menggunakan kotlin, setDownloadListener, CookieManager, Downloading File, mkv, mp4, mp3, 3gp, video, music, file, documen. Dari WILDAN TECHNO ART

Sebelumnya saya sudah mengupload sebuah file.txt pada Zippyshare atau kalian juga bisa menggantinya dengan link download milik kalian sendiri.

Penggunaan DownloadManager pada Webview

Buka Android Studio kalian, buatlah project baru, berinama project tersebut serta nama packagenya, disarankan saat menentukan Minimum Sdknya untuk memilih API 18 (Jellybean 4.3) atau lebih baru, karena jika OS kita API 18 kebawah, terkadang terjadi kegagalan saat mendownload.
WildanTechnoArt-Select_Minimum_SDK
Memilih Minimum SDK

Setelah selesai membuat project tersebut, lalu menuju file AndroidManifest.xml dan masukan kedua uses-permission berikut ini :
WildanTechnoArt-UsesPermission
INTERNET & WRITE_EXTERNAL_STORAGE

Penjelasan:
  • android.permission.INTERNET: Mengizinkan aplikasi membuka soket jaringan.
  • android.permission.WRITE_EXTERNAL_STORAGE: Mengizinkan aplikasi menulis ke penyimpanan eksternal.

Untuk design layoutnya, cukup menggunakan komponen webview dan RelativeLayout sebagai Containernya.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="android.cianjur.developer.net.downloadmanagerexample.my_downloadManager">

    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/my_website"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />
    
</RelativeLayout>

Pada program yang akan kita buat, kita menggunakan sebuah method bernama setDownloadListener() yang terdapat pada webview, digunakan untuk mengunduh suatu konten pada url yang kita masukan.

package android.cianjur.developer.net.downloadmanagerexample;

import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.CookieManager;
import android.webkit.DownloadListener;
import android.webkit.URLUtil;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class my_downloadManager extends AppCompatActivity {

    private WebView website;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_download_manager);
        website = findViewById(R.id.my_website);
        web_settings();
        web_loaded();
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void web_settings(){
        WebSettings webSettings = website.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setSupportZoom(true);
        webSettings.setDisplayZoomControls(true);
        webSettings.setBuiltInZoomControls(true);
    }

    private void web_loaded(){
        String link = "http://www31.zippyshare.com/v/KkEOkG0X/file.html";
        website.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(String.valueOf(Uri.parse(String.valueOf(request))));
                return super.shouldOverrideUrlLoading(view, request);
            }
        });
        website.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long l) {
                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
                DownloadManager DM = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                String cookies = CookieManager.getInstance().getCookie(url);
                request.setMimeType(mimeType);
                request.addRequestHeader("cookies", cookies);
                request.addRequestHeader("uerAgent", userAgent);
                String data_file = URLUtil.guessFileName(url, contentDisposition, mimeType);
                request.setTitle(data_file);
                request.setAllowedOverRoaming(false);
                request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI|DownloadManager.Request.NETWORK_MOBILE);
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.allowScanningByMediaScanner();
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, data_file);
                if (DM != null) {
                    DM.enqueue(request);
                }
                Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
            }
        });
        website.loadUrl(link);
    }

    @Override
    public void onBackPressed() {
        if(website.canGoBack()){
            website.goBack();
        }else {
            super.onBackPressed();
        }
    }
}

Penjelasan:

Method onDownloadListener() digunakan untuk memberitahu aplikasi host bahwa file harus didownload, dengan parameter yang digunakan yaitu:
  • url: link/alamat tautan konten yang harus didownload.
  • userAgent: Kegunaannya untuk memberitahukan informasi situs web tentang browser dan sistem operasi, agar situs web bisa menyesuaikan konten untuk perangkat tertentu.
  • contentDisposition: adalah header yang menunjukkan apakah konten tersebut diharapkan ditampilkan sejajar di browser, yaitu sebagai halaman Web atau sebagai bagian dari halaman Web, atau sebagai lampiran.
  • mimeType: digunakan untuk mengirim berbagai informasi seperti text, gambar, suara, video dll agar browser tidak salah menterjemahkan konten yang diterima, jadi browser akan tahu jenis format pada file yang akan kita download, seperti mp3, mp4, mkv, dll.

Untuk meminta semua informasi yang diperlukan pada file baru yang akan kita download, kita akan menggunakan sebuah class bernama DownloadManager.Request, class ini mempunyai parameter berupa URI.

Dalam method tersebut kita juga menggunakan sebuah class bernama DownloadManager, dengan ini Klien dapat meminta agar URI (Uniform Resource Identifier) diunduh ke file tujuan tertentu. Pengelola unduhan akan melakukan unduhannya di latar belakang dan CookieManager digunakan untuk mengelola cookie pada webview.

Pada class DownloadManager.Request, disana sudah terpasang beberapa artibut yang digunakan untuk downloading, diantaranya:
  • setMimeType(): digunakan untuk menentukan jenis konten yang akan kita download.
  • addRequestHeader(): Untuk menambahkan header HTTP yang akan disertakan dengan permintaan unduhan.
  • URLUtil.guessFileName(): Menebak nama file yang bisa diunduh, yang didapat dari parameter url, contentDiposition dan mimeType.
  • setTitle(): Untuk menetapkan judul unduhan yang akan ditampilkan di notifikasi.
  • setAllowedOverRoaming(): Menetapkan apakah unduhan ini dapat dilanjutkan melalui sambungan roaming atau tidak.
  • setAllowedNetworkTypes(): Untuk membatasi jenis jaringan yang memungkinkan untuk mendownload, disini kita hanya mengunakan jenis jaringan wifi dan mobile, untuk mengaktifkan semua jenis jaringan, kalian bisa menghapus method tersebut.
  • setNotificationVisibility(): Untuk mengontraol pemberitahuan sistem, apakah diposkan/diperlihatkan oleh pengelola unduhan saat unduhan ini berjalan atau selesai, disini kita mengaktifkan pemberitahuan tersebut.
  • allowScanningByMediaScanner(): File yang akan didownload akan dipindai oleh MediaScanner.
  • setDestinationInExternalPublicDir(): Menetapkan tujuan lokal untuk file yang diunduh ke dalam direktori penyimpanan eksternal publik, file yang telah didownload akan disimpan pada Direktori Download yang terdapat pada momory external.

Dan terakhir yaitu enqueue, sebuah atribut yang terdapat pada downloadManager, digunakan untuk memulai proses downloading, Download akan dimulai secara otomatis setelah download manager siap untuk menjalankannya dan konektivitas tersedia.

Sekarang coba jalankan project tersebut menggunakan emulator atau langsung pada perangkat android kalian.
Jika kalian menggunakan link Zippyhare yang saya berikan, terkadang suka muncul iklan yang mengalihkan pada tautan lain, jika hal ini terjadi, tekan tombol back lalu klik kembali link download tersebut.
Berikut ini merupakan Screenshot dari project tersebut.
Hasil Akhir Dari Penggunaan DownloadManager pada Webview-WIldanTechnoArt
Hasil Akhir Penggunaan DownloadManager Pada Webview

Jika ada yang ingin kalian tanyakan, silakan ini kolom komentar dibawah ini, jangan lupa kunjungi terus blog WILDAN TECHNO ART, serta follow untuk mendapatkan update terbaru dan jangan lupa untuk share pada teman-teman kalian yang ingin belajar mengenai pemrograman, khususnya untuk android, Terakhir dari saya, Wassalamualaikum Warahmatullahi Wabarakatuh.

Wildan M Athoillah
Wildan M Athoillah Blogger dan spesialis pembuat aplikasi android.