Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách chụp màn hình (screenshot) theo chương trình trên Android bằng Kotlin

Giới thiệu

Ví dụ này demo cách chụp ảnh màn hình (screenshot) của View gốc (root view) theo chương trình và hiển thị lên ImageView bằng Kotlin.

Các bước thực hiện

Bước 1: Tạo dự án mới

Android Studio > File > New Project.

Bước 2: Layout (activity_main.xml)

Chứa nút bấm "Chụp màn hình" và ImageView để hiển thị kết quả:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:text="Chụp màn hình" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/button"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:scaleType="fitCenter" />

</RelativeLayout>

Bước 3: MainActivity.kt - Logic chụp màn hình

import android.graphics.Bitmap
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity

@Suppress("DEPRECATION")
class MainActivity : AppCompatActivity() {
    private lateinit var mainView: View
    private lateinit var imageView: ImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"

        mainView = findViewById(R.id.main)
        imageView = findViewById(R.id.imageView)
        val btn: Button = findViewById(R.id.button)

        btn.setOnClickListener {
            val bitmap = Screenshot.takeScreenshotOfRootView(imageView)
            imageView.setImageBitmap(bitmap)
            mainView.setBackgroundColor(Color.parseColor("#999999"))
        }
    }

    companion object Screenshot {
        private fun takeScreenshot(view: View): Bitmap {
            view.isDrawingCacheEnabled = true
            view.buildDrawingCache(true)
            val bitmap = Bitmap.createBitmap(view.drawingCache)
            view.isDrawingCacheEnabled = false
            return bitmap
        }

        fun takeScreenshotOfRootView(v: View): Bitmap {
            return takeScreenshot(v.rootView)
        }
    }
}

Bước 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.screenshot">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Chạy ứng dụng

Nhấn nút "Chụp màn hình", ảnh bitmap của toàn bộ root view sẽ được tạo và hiển thị trong ImageView. Nền của layout chính đổi sang xám để phân biệt.

Lưu ý quan trọng

  • Phương pháp drawingCache đã deprecated từ API 28 (Android 9.0).
  • Cách hiện đại (API 24+): Sử dụng PixelCopy hoặc View.draw(Canvas) lên Bitmap.
  • Ví dụ hiện đại:
fun takeScreenshotModern(view: View): Bitmap {
    val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(bitmap)
    view.draw(canvas)
    return bitmap
}
  • Đối với chụp màn hình toàn hệ thống (ngoài app), cần quyền MEDIA_PROJECTION và MediaProjectionManager.