Source Code dasar android studio pembuatan aplikasi screen recorder
Table of Contents
Halo sahabat javasetid.com, salah satu fitur atau aplikasi yang sangat berguna diantaranya adalah screen recorder, sesuai namanya aplikasi ini berfungsi untuk rekam layar di smartphone kalian lalu digunakan sesuai kebutuhan.
Pada dasarnya buat sobat yang mau mencoba membuat aplikasi sejenis yang bisa digunakan diperangkat lain tanpa iklan bisa kita lakukan dengan batuan software coding android studio, pada kesempatan yang langka ini sobat bisa coba dan kembangkan lebih jauh dari source code dasar pembuatan aplikasi screen recorder ini.
Buka aplikasi android studio dan mulai projek baru pilih yang empty dan pilih bahasa java. Untuk nama projeknya saya pakai Baiyucam codingan pertama kita langsung atus saja di android manifest kurang lebih ini kodenya.
1. Android Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Baiyucam"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
setelah selesai kita lanjut ke main activitynya berikut kodenya.
2. MainActivity
package com.baiyucam;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final int PERMISSION_CODE = 1;
private MediaProjectionManager projectionManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
projectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
Button startButton = findViewById(R.id.start_record_button);
Button stopButton = findViewById(R.id.stop_record_button);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Meminta izin dari pengguna untuk merekam layar
Intent captureIntent = projectionManager.createScreenCaptureIntent();
startActivityForResult(captureIntent, PERMISSION_CODE);
}
});
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Mengirim sinyal ke service untuk berhenti merekam
Intent serviceIntent = new Intent(MainActivity.this, ScreenRecorderService.class);
stopService(serviceIntent);
Toast.makeText(MainActivity.this, "Perekaman berhenti.", Toast.LENGTH_SHORT).show();
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode != PERMISSION_CODE || resultCode != RESULT_OK) {
Toast.makeText(this, "Izin perekaman ditolak.", Toast.LENGTH_SHORT).show();
return;
}
// Jika izin diberikan, mulai service untuk perekaman
Intent serviceIntent = new Intent(this, ScreenRecorderService.class);
serviceIntent.putExtra("resultCode", resultCode);
serviceIntent.putExtra("data", data);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(serviceIntent);
}
Toast.makeText(this, "Perekaman dimulai...", Toast.LENGTH_SHORT).show();
}
}
jangan lupa tambahkan java class dan copas kode berikut ini.
3. ScreenRecorderService
package com.baiyucam;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.MediaRecorder;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.os.Environment;
import android.os.IBinder;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.SparseIntArray;
import android.view.Surface;
import android.view.WindowManager;
import androidx.core.app.NotificationCompat;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class ScreenRecorderService extends Service {
private MediaProjection mediaProjection;
private MediaRecorder mediaRecorder;
private VirtualDisplay virtualDisplay;
private static final String CHANNEL_ID = "ScreenRecorderChannel";
private int screenDensity;
private int screenWidth;
private int screenHeight;
private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
static {
ORIENTATIONS.append(Surface.ROTATION_0, 90);
ORIENTATIONS.append(Surface.ROTATION_90, 0);
ORIENTATIONS.append(Surface.ROTATION_180, 270);
ORIENTATIONS.append(Surface.ROTATION_270, 180);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null) {
int resultCode = intent.getIntExtra("resultCode", 0);
Intent data = intent.getParcelableExtra("data");
if (data != null) {
// Mendapatkan MediaProjection dari intent
MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
mediaProjection = projectionManager.getMediaProjection(resultCode, data);
// Menginisialisasi MediaRecorder
initRecorder();
try {
mediaRecorder.prepare();
virtualDisplay = createVirtualDisplay();
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
// Menjalankan sebagai foreground service
createNotificationChannel();
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Merekam Layar")
.setContentText("Aplikasi sedang merekam layar Anda.")
.setSmallIcon(R.drawable.ic_launcher_foreground) // Ganti dengan ikon notifikasi Anda
.build();
startForeground(1, notification);
}
}
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mediaRecorder != null) {
try {
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
} catch (IllegalStateException e) {
// handle error
}
}
if (virtualDisplay != null) {
virtualDisplay.release();
}
if (mediaProjection != null) {
mediaProjection.stop();
}
}
private void initRecorder() {
try {
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getRealMetrics(metrics);
screenDensity = metrics.densityDpi;
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
mediaRecorder = new MediaRecorder();
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) +
"/ScreenRecord_" + new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()) + ".mp4";
mediaRecorder.setOutputFile(filePath);
mediaRecorder.setVideoSize(screenWidth, screenHeight);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoEncodingBitRate(5 * 1024 * 1024); // 5 Mbps
mediaRecorder.setVideoFrameRate(30);
int rotation = windowManager.getDefaultDisplay().getRotation();
int orientation = ORIENTATIONS.get(rotation + 90);
mediaRecorder.setOrientationHint(orientation);
} catch (Exception e) {
Log.e("ScreenRecorderService", "Error initializing MediaRecorder: " + e.getMessage());
}
}
private VirtualDisplay createVirtualDisplay() {
return mediaProjection.createVirtualDisplay("ScreenRecord",
screenWidth, screenHeight, screenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mediaRecorder.getSurface(), null, null);
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
CHANNEL_ID,
"Screen Recorder Service",
NotificationManager.IMPORTANCE_DEFAULT
);
NotificationManager manager = getSystemService(NotificationManager.class);
manager.createNotificationChannel(serviceChannel);
}
}
}
Langkah terakhir kita kebagian activity_main untuk kodenya copas saja ya
4. activity_main
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<Button
android:id="@+id/start_record_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mulai Rekam"
android:layout_centerInParent="true"/>
<Button
android:id="@+id/stop_record_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Berhenti Rekam"
android:layout_below="@id/start_record_button"
android:layout_centerHorizontal="true"
android:layout_marginTop="16dp"/>
</RelativeLayout>
5. Kesimpulan
Kode ini hanyalah dasar untuk pembuatan screen recorder, gunakanlah sebagai referensi untuk menambah beberapa fitur lainnya agar kode ini bekerja dengan baik, untuk kode bisa kamu dm admin, semoga artikel ini bermanfaat sampai ketemu pada artikel berikutnya.
Posting Komentar