Nama : Yogi Eko Febriano NIM : 203307020 Kelas : TI – 2A A. 1. Buat Empety Activity 2. Tambahkan hak permission agar aplikasi bisa terhubung ke internet 3. Buat Direktori raw dan menambahkan file mp4. 4.membuat suatu aksi/melakukan perintah dengan melakukan penulisan kode atau intruksi mesin untuk melakukan perintah inputan, yang diproses. Kode XML activity_main.xml : <?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=".MainActivity"> <VideoView android:id="@+id/videoView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_margin="10dp"/> </RelativeLayout> Kode Kotlin MainActivity.kt package com.example.viewvideoyogi import import import import import android.net.Uri androidx.appcompat.app.AppCompatActivity android.os.Bundle android.widget.MediaController android.widget.VideoView class MainActivity : AppCompatActivity() { // Menginilisasi variabel videoView yang menggunakan fungsi VideoView private lateinit var videoView: VideoView // Menginilisasi tampilan yang akan di proses override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // memanggil layout videoview di xml dan melakukan pendeklarasian di dalam variabel videoView = findViewById(R.id.videoView) val mediaController = MediaController(this) mediaController.setAnchorView(videoView) // memanggil video yang berada di internet dengan link url video dan menambahkan kedalam variabel, mengambil fungsi pengambilan url dengan perintah uri.parse val onlineUri : Uri = Uri.parse("https://cdn.videvo.net/videvo_files/video/premium/video0229/small_ watermarked/07_usa_day_4_368_heart_preview.webm") // memanggil file video yang berada dengan satu file dengan folder memasukan perintah kedalam variabel val offlineUri : Uri = Uri.parse("android.resource://$packageName/${R.raw.vidio1}") videoView.setMediaController(mediaController) video videoView.setVideoURI(offlineUri) // videoView.setVideoURI(onlineUri) videoView.requestFocus() videoView.start() } } PrintScreen : Offline: Online: dan //inisiasi pengontrolan //memanggil URI video B. 1. Membuat Project Empety Activity dengan nama ViewImage Yogi. 2. Menambahkan Akses untuk izin aplikasi untuk menggunakan kamera. 3. Membuat tampilan ui android. 4. Membuat Aksi untuk melakukan intruksi mesin sesuai kode yang di intruksikan. SourceCode Activity_main.xml <?xml version="1.0"encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:id="@+id/imageView" android:layout_width="324dp" android:layout_height="223dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.597" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.09" app:srcCompat="@drawable/ic_launcher_background" tools:ignore="VectorDrawableCompat"/> <Button android:id="@+id/btn_Capture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="CAPTURE" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.265" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.478"/> <Button android:id="@+id/btn_gallery" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="GALLERY" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.775" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.478"/> <Button android:id="@+id/btn_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SAVE" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.253" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.616"/> </androidx.constraintlayout.widget.ConstraintLayout> MainActivity.kt package com.example.viewimageyogi import import import import import import import import import import import import import import import import import import android.content.ContentValues android.content.Intent android.content.pm.PackageManager android.graphics.Bitmap android.os.Build android.os.Bundle android.os.Environment android.provider.MediaStore android.widget.Button android.widget.ImageView android.widget.Toast androidx.appcompat.app.AppCompatActivity androidx.core.app.ActivityCompat androidx.core.view.drawToBitmap java.io.File java.io.OutputStream java.util.* java.util.jar.Manifest class MainActivity : private lateinit var private lateinit var private lateinit var private lateinit var AppCompatActivity() { btnCapture : Button btnGallery : Button imgView : ImageView btnSave : Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) btnCapture btnGallery imgView btnSave = = = = findViewById<Button>(R.id.btn_Capture) findViewById<Button>(R.id.btn_gallery) findViewById<ImageView>(R.id.imageView) findViewById<Button>(R.id.btn_save) //action untuk klik tombol capture btnCapture.setOnClickListener { //lakukan cek permission untuk mengakses kamera if (ActivityCompat.checkSelfPermission(this,android.Manifest.permission.CAMERA)! = PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA), 123) } else { //bila 'ALLOW' maka program bisa mengakses camera dengan requestCode 123 val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) startActivityForResult(intent, 123) } } //action untuk klik tombol Gallery btnGallery.setOnClickListener { //mengakses direktori image val intent = Intent(Intent.ACTION_PICK) intent.type = "image/*" startActivityForResult(intent, 456) } //action untuk klik tombol save btnSave.setOnClickListener{ val bitmap = imgView.drawToBitmap() saveImage(bitmap) //panggil fungsi saveImage } } private fun saveImage(bitmap: Bitmap) { val fos: OutputStream if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val resolver = contentResolver val contentValues = ContentValues() //Simpan File Gambar.jpg ke dalam direktori FolderPraktikum contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME,"Gambar"+".jpg") contentValues.put(MediaStore.MediaColumns.MIME_TYPE,"image/jpg") contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH,Environment.DIRECTORY _PICTURES+File.separator+"FolderPraktikum") val imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues) fos = resolver.openOutputStream(Objects.requireNonNull(imageUri)!!)!! bitmap.compress(Bitmap.CompressFormat.JPEG, 30,fos) Objects.requireNonNull<OutputStream?>(fos) Toast.makeText(this, "Berhasil disimpan", Toast.LENGTH_SHORT).show() }else{ Toast.makeText(this, "Gagal disimpan",Toast.LENGTH_SHORT).show() } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == 123) { // tombol Capture val bmp = data?.extras?.get("data")as Bitmap imgView.setImageBitmap(bmp) }else if (requestCode == 456) { //tombol Gallery imgView.setImageURI(data?.data) } } } PrintScreen: Tampilan awal. Setelah di klik capture Maka akan berubah tampilanya seperti ini. Ketika disimpan gagal.