{"id":1087,"date":"2022-11-18T15:54:02","date_gmt":"2022-11-18T15:54:02","guid":{"rendered":"https:\/\/unydevelopernetwork.com\/?p=1087"},"modified":"2022-11-18T16:00:48","modified_gmt":"2022-11-18T16:00:48","slug":"membuat-aplikasi-video-streaming-android-sederhana","status":"publish","type":"post","link":"https:\/\/unydevelopernetwork.com\/index.php\/2022\/11\/18\/membuat-aplikasi-video-streaming-android-sederhana\/","title":{"rendered":"Membuat Aplikasi Video Streaming Android Sederhana"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 5<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>\n<p>Selamat datang di UNYDeveloperNetwork. Pada postingan ini kita akan belajar sedikit banyak bagaimana membuat aplikasi video streaming sederhana di Android. Ya, video streaming, seperti Youtube-lah, namun dalam versi yang paling sederhana. Sederhana di sini tidak hanya sebatas hanya memutar ya, namun juga dapat mengontrol media yang diputar secara streaming juga. Bagaimana cara membangunnya? Mari kita simak postingan berikut ini.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Sebelum kita bergerak lebih jauh, Anda pasti bertanya-tanya. Apa sih pentingnya membuat aplikasi video streaming di Android? Ya, jawaban untuk pertanyaan itu tentu kembali ke masing-masing individu ya, mungkin untuk project Anda, tiba-tiba memerlukan fitur video streaming? Atau Anda sedang menyelesaikan tugas akhir dan tiba-tiba memerlukan fitur video streaming? Atau professor Anda meminta Anda untuk membuat aplikasi video streaming? Siapa yang tahu bukan? Oleh karena itu, di dalam postingan ini, Saya ingin berbagi dengan Anda bagaimana membuat aplikasi video streaming sederhana di Android. Kata kuncinya di sini adalah <strong>sederhana<\/strong>. OK? Jadi tidak ada fitur yang aneh aneh seperti Youtube ads dan lain sebagainya. <\/p>\n\n\n\n<p>Ok, kira-kira bagaimana hasil akhir dari project kita ini nanti? Mari kita saksikan video hasil akhir dari project ini.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"UDN: video stream android\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/BVeyANPiLVQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<\/div><\/figure>\n\n\n\n<p>Menarik bukan? Mudah kok untuk membuatnya, tidak memerlukan library yang aneh-aneh dan hanya terdiri dari dua activity saja. Bahkan sebenarnya jika mau dipaksakan, bisa juga dengan menggunakan satu activity saja. Bagaimana cara membangunnya? Mari kita mulai: <strong>membangun aplikasi video streaming Android sederhana<\/strong>.<\/p>\n\n\n\n<p><strong>1. Membuat Project Baru<\/strong><\/p>\n\n\n\n<p>Ya tentu saja, ini langkah paling dasar. Iya kan? Buatlah sebuah project baru dengan nama <strong>SimpleVideoStreamer. <\/strong>Anda tentu saja boleh menggunakan nama yang lain. Untuk activity, pilihlah <strong>Empty Activity<\/strong><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213611-700x505.png\" alt=\"\" class=\"wp-image-1089\" width=\"562\" height=\"405\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213611-700x505.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213611-300x217.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213611-768x554.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213611.png 902w\" sizes=\"auto, (max-width: 562px) 100vw, 562px\" \/><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213639-700x505.png\" alt=\"\" class=\"wp-image-1088\" width=\"561\" height=\"405\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213639-700x505.png 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213639-300x217.png 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213639-768x554.png 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/Screenshot_20221118_213639.png 902w\" sizes=\"auto, (max-width: 561px) 100vw, 561px\" \/><\/figure>\n<\/div>\n\n\n<p>Untuk bahasa yang digunakan, pilih <strong>Java<\/strong>, OK? No comment dulu ya. Mengapa Java, tidak Kotlin. Bukan saya anti dengan Kotlin, tetapi karena memang basic saya adalah programmer Java jadi saya prefer untuk menggunakan bahasa Pemrograman Java. OK? Hehehe. Untuk minimum SDK pada project ini menggunakan API 30 (Android 11). <\/p>\n\n\n\n<p><strong>2. Konfigurasi Manifest<\/strong><\/p>\n\n\n\n<p>Langkah selanjutnya adalah mengonfigurasi manifest agar kita dapat melakukan stream video dari internet. Pertama tambahkan <strong>uses-permission internet<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;uses-permission android:name=\"android.permission.INTERNET\" \/><\/code><\/pre>\n\n\n\n<p>Selanjutnya tambahkan parameter berikut pada tag <strong>&lt;application> <\/strong>untuk memastikan aplikasi kita dapat melakukan stream dari server non HTTPS <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>android:usesCleartextTraffic=\"true\"<\/code><\/pre>\n\n\n\n<p>Perubahan sementara di manifest kita adalah seperti kode di bawah ini.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n&lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\">\r\n\r\n    &lt;uses-permission android:name=\"android.permission.INTERNET\" \/>\r\n\r\n    &lt;application\r\n        android:allowBackup=\"true\"\r\n        android:dataExtractionRules=\"@xml\/data_extraction_rules\"\r\n        android:fullBackupContent=\"@xml\/backup_rules\"\r\n        android:icon=\"@mipmap\/ic_launcher\"\r\n        android:label=\"@string\/app_name\"\r\n        android:roundIcon=\"@mipmap\/ic_launcher_round\"\r\n        android:supportsRtl=\"true\"\r\n        android:theme=\"@style\/Theme.SimpleVideoStreamer\"\r\n        android:usesCleartextTraffic=\"true\"\r\n        tools:targetApi=\"31\"><\/code><\/pre>\n\n\n\n<p><strong>3. Tambahkan value pada strings.xml<\/strong><\/p>\n\n\n\n<p>Ya, kita akan menambahkan beberapa string untuk mendukung beberapa view yang akan kita buat dalam project kali ini. Berikut adalah list string yang dibuat untuk project ini.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;resources>\r\n    &lt;string name=\"app_name\">SimpleVideoStreamer&lt;\/string>\r\n    &lt;string name=\"input_label\">URL Input&lt;\/string>\r\n    &lt;string name=\"input_hint\">Enter your video URL here...&lt;\/string>\r\n    &lt;string name=\"btn_label_start\">Start Stream&lt;\/string>\r\n    &lt;string name=\"btn_label_reset\">Clear URL Input&lt;\/string>\r\n&lt;\/resources><\/code><\/pre>\n\n\n\n<p><strong>4. Layout MainActivity<\/strong><\/p>\n\n\n\n<p>Berikut adalah layout dari activity_main.xml (MainActivity.java)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n&lt;RelativeLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\r\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"match_parent\"\r\n    android:layout_margin=\"20dp\"\r\n    tools:context=\".MainActivity\">\r\n\r\n    &lt;TextView\r\n        android:id=\"@+id\/label_input\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:text=\"@string\/input_label\"\r\n        android:textSize=\"20sp\" \/>\r\n\r\n    &lt;EditText\r\n        android:id=\"@+id\/input_url\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_below=\"@+id\/label_input\"\r\n        android:layout_marginTop=\"3dp\"\r\n        android:ems=\"10\"\r\n        android:hint=\"@string\/input_hint\"\r\n        android:importantForAutofill=\"no\"\r\n        android:inputType=\"textUri\"\r\n        android:minHeight=\"48dp\"\r\n        android:textColorHint=\"#757575\" \/>\r\n\r\n    &lt;Button\r\n        android:id=\"@+id\/start_button\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_below=\"@+id\/input_url\"\r\n        android:backgroundTint=\"@color\/teal_700\"\r\n        android:text=\"@string\/btn_label_start\"\r\n        tools:ignore=\"TextContrastCheck\" \/>\r\n\r\n    &lt;Button\r\n        android:id=\"@+id\/reset_button\"\r\n        android:layout_width=\"wrap_content\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_below=\"@id\/input_url\"\r\n        android:layout_marginStart=\"10dp\"\r\n        android:layout_toEndOf=\"@+id\/start_button\"\r\n        android:text=\"@string\/btn_label_reset\" \/>\r\n\r\n&lt;\/RelativeLayout>\r\n\r<\/code><\/pre>\n\n\n\n<p><strong>5. Layout VideoPlayer<\/strong><\/p>\n\n\n\n<p>Selanjutnya, buat activity baru sebagai player dari video kita. Activity baru ini kita beri nama <strong>VideoPlayer<\/strong> (VideoPlayer.java; activity_video_player.xml). Setelah Activity baru terbentuk, buatlah layout yang khusus hanya berisi View VideoView<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n&lt;RelativeLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\r\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"match_parent\"\r\n    tools:context=\".VideoPlayer\">\r\n\r\n    &lt;VideoView\r\n        android:id=\"@+id\/video_player\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"match_parent\"\r\n        android:layout_centerInParent=\"true\"\/>\r\n&lt;\/RelativeLayout><\/code><\/pre>\n\n\n\n<p><strong>6. Konfigurasi Ulang Manifest<\/strong><\/p>\n\n\n\n<p>Kita perlu mengonfigurasi ulang manifest untuk memastikan behavior aplikasi ini baik. Konfigurasi yang kita lakukan adalah pada aspek <strong>screen orientation<\/strong> dan <strong>parent activity<\/strong>. Berikut adalah final dari manifest project kita<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n&lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:tools=\"http:\/\/schemas.android.com\/tools\">\r\n\r\n    &lt;uses-permission android:name=\"android.permission.INTERNET\" \/>\r\n\r\n    &lt;application\r\n        android:allowBackup=\"true\"\r\n        android:dataExtractionRules=\"@xml\/data_extraction_rules\"\r\n        android:fullBackupContent=\"@xml\/backup_rules\"\r\n        android:icon=\"@mipmap\/ic_launcher\"\r\n        android:label=\"@string\/app_name\"\r\n        android:roundIcon=\"@mipmap\/ic_launcher_round\"\r\n        android:supportsRtl=\"true\"\r\n        android:theme=\"@style\/Theme.SimpleVideoStreamer\"\r\n        android:usesCleartextTraffic=\"true\"\r\n        tools:targetApi=\"31\">\r\n        &lt;activity\r\n            android:name=\".VideoPlayer\"\r\n            android:parentActivityName=\".MainActivity\"\r\n            android:screenOrientation=\"landscape\"\r\n            android:exported=\"false\">\r\n            &lt;meta-data\r\n                android:name=\"android.app.lib_name\"\r\n                android:value=\"\" \/>\r\n        &lt;\/activity>\r\n        &lt;activity\r\n            android:name=\".MainActivity\"\r\n            android:exported=\"true\"\r\n            android:screenOrientation=\"portrait\">\r\n            &lt;intent-filter>\r\n                &lt;action android:name=\"android.intent.action.MAIN\" \/>\r\n\r\n                &lt;category android:name=\"android.intent.category.LAUNCHER\" \/>\r\n            &lt;\/intent-filter>\r\n\r\n            &lt;meta-data\r\n                android:name=\"android.app.lib_name\"\r\n                android:value=\"\" \/>\r\n        &lt;\/activity>\r\n    &lt;\/application>\r\n\r\n&lt;\/manifest><\/code><\/pre>\n\n\n\n<p><strong>7. Class: VideoPlayer.java<\/strong><\/p>\n\n\n\n<p>Selanjutnya kita akan membuat logika pemrograman untuk video player. Mengapa kita mendahulukan activity video player daripada main activity nya? Karena activity inilah yang merupakan core dari project ini. Memutar video dengan sourcenya adalah berupa URI; yang mana secara otomatis akan melakukan stream ke URI yang telah diatur. Berikut adalah kodingannya.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.unydevelopernetwork.simplevideostreamer;\r\n\r\nimport androidx.appcompat.app.AppCompatActivity;\r\n\r\nimport android.graphics.PixelFormat;\r\nimport android.net.Uri;\r\nimport android.os.Bundle;\r\nimport android.widget.MediaController;\r\nimport android.widget.VideoView;\r\n\r\nimport com.google.android.material.snackbar.Snackbar;\r\n\r\npublic class VideoPlayer extends AppCompatActivity {\r\n\r\n    private VideoView videoPlayer;\r\n    private String videoURL;\r\n\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_video_player);\r\n        initLevel0();\r\n        initLevel1();\r\n        initLevel2();\r\n    }\r\n\r\n    private void initLevel0(){\r\n        videoPlayer = findViewById(R.id.video_player);\r\n    }\r\n\r\n    private void initLevel1(){\r\n        videoURL = getIntent().getStringExtra(\"VIDEO_URL\");\r\n    }\r\n\r\n    private void initLevel2(){\r\n        videoPlayer();\r\n    }\r\n\r\n    private void videoPlayer(){\r\n        Snackbar.make(findViewById(android.R.id.content), \"Video Buffering...\", Snackbar.LENGTH_LONG).show();\r\n        try {\r\n            getWindow().setFormat(PixelFormat.TRANSLUCENT);\r\n            MediaController mediaController = new MediaController(this);\r\n            mediaController.setAnchorView(videoPlayer);\r\n\r\n            Uri video = Uri.parse(videoURL);\r\n            videoPlayer.setMediaController(mediaController);\r\n            videoPlayer.setVideoURI(video);\r\n            videoPlayer.requestFocus();\r\n            videoPlayer.setOnPreparedListener(mp -> videoPlayer.start());\r\n        }\r\n        catch(Exception e) {\r\n            Snackbar.make(findViewById(android.R.id.content), \"Video Play Error:\" + e, Snackbar.LENGTH_LONG).show();\r\n            finish();\r\n        }\r\n    }\r\n}<\/code><\/pre>\n\n\n\n<p><strong>8. Class: MainActivity.java<\/strong><\/p>\n\n\n\n<p>Terakhir kita membuat logika pemrograman untuk main activity nya. Secara sederhana di kelas main activity terdapat tiga aksi:<\/p>\n\n\n\n<p>a. Menangkap Inputan dari User<br>b. Memulai activity video player dengan parameter URI berasal dari inputan user<br>c. Mereset inputan dari user<\/p>\n\n\n\n<p>Berikut adalah kodingannya:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.unydevelopernetwork.simplevideostreamer;\r\n\r\nimport androidx.appcompat.app.AppCompatActivity;\r\n\r\nimport android.annotation.SuppressLint;\r\nimport android.content.Intent;\r\nimport android.os.Bundle;\r\nimport android.widget.Button;\r\nimport android.widget.EditText;\r\n\r\npublic class MainActivity extends AppCompatActivity {\r\n\r\n    private EditText inputURL;\r\n    private Button btnStartStream, btnReset;\r\n    private String videoURL;\r\n\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_main);\r\n        initLevel0();\r\n        initLevel1();\r\n        initLevel2();\r\n    }\r\n\r\n    private void initLevel0(){\r\n        inputURL = findViewById(R.id.input_url);\r\n        btnStartStream = findViewById(R.id.start_button);\r\n        btnReset = findViewById(R.id.reset_button);\r\n    }\r\n\r\n    @SuppressLint(\"ClickableViewAccessibility\")\r\n    private void initLevel1(){\r\n        btnStartStream.setOnTouchListener((view, motionEvent) -> {\r\n            getInput();\r\n            startStream();\r\n            return false;\r\n        });\r\n    }\r\n\r\n    @SuppressLint(\"ClickableViewAccessibility\")\r\n    private void initLevel2(){\r\n        btnReset.setOnTouchListener((view, motionEvent) -> {\r\n            resetInput();\r\n            return false;\r\n        });\r\n    }\r\n    \r\n    private void getInput(){\r\n        videoURL = inputURL.getText()+\"\";\r\n    }\r\n\r\n    private void startStream(){\r\n        Intent streamIntent = new Intent(MainActivity.this, VideoPlayer.class);\r\n        streamIntent.putExtra(\"VIDEO_URL\", videoURL);\r\n        startActivity(streamIntent);\r\n    }\r\n\r\n    private void resetInput(){\r\n        inputURL.getText().clear();\r\n    }\r\n}<\/code><\/pre>\n\n\n\n<p><strong>9. Testing<\/strong><\/p>\n\n\n\n<p>Untuk testing pada project kali ini, saya menggunakan device (bukan AVD) Google Pixel 3A XL. Sedangkan untuk Video test menggunakan URL berikut ini:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#47;&#47;cdn.unydevelopernetwork.com\/unydevelopernetwork\/ex_video_stream_android.mp4<\/code><\/pre>\n\n\n\n<p>Berikut adalah hasil testingnya:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-700x1400.jpg\" alt=\"\" class=\"wp-image-1090\" width=\"263\" height=\"526\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-700x1400.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-150x300.jpg 150w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-768x1536.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50.jpg 800w\" sizes=\"auto, (max-width: 263px) 100vw, 263px\" \/><figcaption class=\"wp-element-caption\">Tampilan awal ketika aplikasi dijalankan<\/figcaption><\/figure>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-1-700x1400.jpg\" alt=\"\" class=\"wp-image-1091\" width=\"263\" height=\"526\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-1-700x1400.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-1-150x300.jpg 150w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-1-768x1536.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-1.jpg 800w\" sizes=\"auto, (max-width: 263px) 100vw, 263px\" \/><figcaption class=\"wp-element-caption\">Tampilan aplikasi ketika diberikan input (softInput muncul)<\/figcaption><\/figure>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-2-700x1400.jpg\" alt=\"\" class=\"wp-image-1092\" width=\"270\" height=\"540\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-2-700x1400.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-2-150x300.jpg 150w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-2-768x1536.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.50-2.jpg 800w\" sizes=\"auto, (max-width: 270px) 100vw, 270px\" \/><figcaption class=\"wp-element-caption\">Tampilan aplikasi setelah &#8220;Clear URL Input&#8221; (kolom inputan bersih, namun softInput masih tampak)<\/figcaption><\/figure>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"350\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-700x350.jpg\" alt=\"\" class=\"wp-image-1093\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-700x350.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-300x150.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-768x384.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-1536x768.jpg 1536w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51.jpg 1600w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption class=\"wp-element-caption\">Tampilan aplikasi ketika memproses inputan dari User (muncul snackbar Video Buffering&#8230;)<\/figcaption><\/figure>\n<\/div><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"350\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-1-700x350.jpg\" alt=\"\" class=\"wp-image-1094\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-1-700x350.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-1-300x150.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-1-768x384.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-1-1536x768.jpg 1536w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-1.jpg 1600w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption class=\"wp-element-caption\">Tampilan aplikasi ketika proses buffering selesai (muncul kotak hitam ditengah -> ukuran video)<\/figcaption><\/figure>\n<\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"350\" src=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-2-700x350.jpg\" alt=\"\" class=\"wp-image-1095\" srcset=\"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-2-700x350.jpg 700w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-2-300x150.jpg 300w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-2-768x384.jpg 768w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-2-1536x768.jpg 1536w, https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-2.jpg 1600w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption class=\"wp-element-caption\">Tampilan aplikasi ketika mulai memutar video lengkap dengan media controllernya.<\/figcaption><\/figure>\n<\/div><\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Bagaimana? cukup mudah bukan? Saya rasa project ini masih cukup mudah. Selanjutnya mungkin kita akan bermain-main dengan file-file video yang tersimpan di Android kita. Yep bisa ditebak, kita membuat video player sederhana, seperti VLC atau Video player yang lain, namun yang sederhana saja. Tapi, kita simpan hal ini untuk project yang lain ya? ^_^<\/p>\n\n\n\n<p>Anda dapat mengunduh project ini secara lengkap melalui tautan berikut ini: <br><strong><a href=\"https:\/\/github.com\/milstrike\/SimpleVideoStreaming\" target=\"_blank\" rel=\"noreferrer noopener\">Github: Simple Video Streaming<\/a><\/strong><\/p>\n\n\n\n<p>Baiklah, demikian postingan saya tentang\u00a0<strong>Membuat Aplikasi Video Streaming Android Sederhana<\/strong>. Semoga bermanfaat bagi Anda para pembaca. Apabila ada pertanyaan mengenai postingan ini, Anda dapat meninggalkannya di kolom komentar. Dan, Apabila Anda menemukan artikel ini berguna, Anda dapat membagikannya. Anda juga dapat mencuplik beberapa bagian dari artikel ini, namun jangan lupa untuk sertakan URL nya. Terima kasih.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">^_^<\/h2>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 5<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Selamat datang di UNYDeveloperNetwork. Pada postingan ini kita akan belajar sedikit banyak bagaimana membuat aplikasi video streaming sederhana di Android. Ya, video streaming, seperti Youtube-lah, namun dalam versi yang paling sederhana. Sederhana&#8230;<\/p>\n","protected":false},"author":1,"featured_media":1095,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,27,2,69],"tags":[327,330,5,72,59,4,328,329],"class_list":["post-1087","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","category-software-development","category-tutorial","category-umum-software-development","tag-android","tag-android-project","tag-java","tag-pemrograman","tag-programming","tag-tutorial","tag-video-streaming","tag-video-streaming-app"],"featured_image_src":"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-2.jpg","author_info":{"display_name":"Muhammad Irfan Luthfi","author_link":"https:\/\/unydevelopernetwork.com\/index.php\/author\/admin\/"},"jetpack_featured_media_url":"https:\/\/unydevelopernetwork.com\/wp-content\/uploads\/2022\/11\/WhatsApp-Image-2022-11-18-at-23.36.51-2.jpg","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/1087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/comments?post=1087"}],"version-history":[{"count":1,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/1087\/revisions"}],"predecessor-version":[{"id":1096,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/posts\/1087\/revisions\/1096"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/media\/1095"}],"wp:attachment":[{"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/media?parent=1087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/categories?post=1087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unydevelopernetwork.com\/index.php\/wp-json\/wp\/v2\/tags?post=1087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}