Bagaimana saya bisa mengambil tangkapan layar dari area tertentu pada layar ponsel bukan oleh program apa pun tetapi dari kode?
android
screenshot
korovaisdead
sumber
sumber
Jawaban:
Berikut adalah kode yang memungkinkan tangkapan layar saya disimpan di kartu SD dan digunakan nanti untuk apa pun kebutuhan Anda:
Pertama, Anda perlu menambahkan izin yang tepat untuk menyimpan file:
Dan ini adalah kode (berjalan dalam suatu Aktivitas):
Dan ini adalah bagaimana Anda dapat membuka gambar yang baru saja dibuat:
Jika Anda ingin menggunakan ini pada tampilan fragmen kemudian gunakan:
dari pada
pada fungsi takeScreenshot ()
Catatan :
Solusi ini tidak berfungsi jika dialog Anda berisi tampilan permukaan. Untuk perincian, silakan periksa jawaban untuk pertanyaan berikut:
Android Ambil Screenshot dari Surface View Menunjukkan Black Screen
sumber
mCurrentUrlMask
harusView
merupakan kelas unik di Android API yang memilikigetRootView()
metode. Mungkin tampilan di UI.View v1 = mCurrentUrlMask.getRootView();
saya telah menggunakanView v1 = getWindow().getDecorView().getRootView();
dan berfungsi untuk saya.Panggil metode ini, melewati paling luar ViewGroup yang Anda inginkan tangkapan layar:
sumber
view
? `getWindow().getDecorView().getRootView()
sebagai hasil tampilan dalam mengambil tangkapan layar hanya aplikasi - bukan layar.Catatan: hanya berfungsi untuk telepon yang di-rooting
Secara pemrograman, Anda dapat menjalankan
adb shell /system/bin/screencap -p /sdcard/img.png
seperti di bawah inikemudian baca
img.png
sebagaiBitmap
dan gunakan sesuai keinginan Anda.sumber
System.err : java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
, perangkat saya android 5.0EDIT: berbelas kasihan dengan downvotes. Memang benar pada tahun 2010 ketika saya menjawab pertanyaan itu.
Semua program yang memungkinkan tangkapan layar hanya berfungsi pada telepon yang di-rooting.
sumber
Tidak ada izin root atau tidak ada pengkodean besar yang diperlukan untuk metode ini.
Pada adb shell menggunakan perintah di bawah ini Anda dapat mengambil screenshot.
Perintah ini tidak memerlukan izin root apa pun sehingga Anda juga dapat melakukan dari kode java aplikasi android.
Lebih lanjut tentang kode keyevent di android lihat http://developer.android.com/reference/android/view/KeyEvent.html
Di sini kita telah menggunakan. KEYCODE_SYSRQ nilainya 120 dan digunakan untuk kunci Permintaan Sistem / Layar Cetak.
Seperti yang dikatakan CJBS, Gambar output akan disimpan di / sdcard / Pictures / Screenshot
sumber
/sdcard/Pictures/Screenshots
su -c "input keyevent 120"
ok !!Jawaban Mualig sangat bagus, tetapi saya memiliki masalah yang sama yang dijelaskan Ewoks, saya tidak mendapatkan latar belakang. Jadi kadang-kadang cukup baik dan kadang-kadang saya mendapatkan teks hitam di atas latar belakang hitam (tergantung pada temanya).
Solusi ini sangat berbasis pada kode Mualig dan kode yang saya temukan di Robotium. Saya membuang penggunaan draw cache dengan menelepon langsung ke metode draw. Sebelum itu saya akan mencoba untuk mendapatkan latar belakang yang dapat digambar dari aktivitas saat ini untuk menggambarnya terlebih dahulu.
sumber
Tambahkan izin di manifes
Untuk Mendukung Marshmallow atau versi di atas, silakan tambahkan kode di bawah ini dalam aktivitas metode onCreate
sumber
Sebagai referensi, salah satu cara untuk menangkap layar (dan bukan hanya aktivitas aplikasi Anda) adalah dengan menangkap framebuffer (perangkat / dev / graphics / fb0). Untuk melakukan ini, Anda harus memiliki hak akses root atau aplikasi Anda harus merupakan aplikasi dengan izin tanda tangan ("Izin yang diberikan sistem hanya jika aplikasi yang meminta ditandatangani dengan sertifikat yang sama dengan aplikasi yang menyatakan izin") - yang merupakan sangat tidak mungkin kecuali Anda mengkompilasi ROM Anda sendiri.
Setiap tangkapan framebuffer, dari beberapa perangkat yang telah saya uji, berisi persis satu tangkapan layar. Orang-orang telah melaporkannya mengandung lebih banyak, saya kira itu tergantung pada ukuran bingkai / tampilan.
Saya mencoba membaca framebuffer secara terus-menerus tetapi sepertinya mengembalikan sejumlah byte yang telah dibaca. Dalam kasus saya yaitu (3 410 432) byte, yang cukup untuk menyimpan bingkai tampilan 854 * 480 RGBA (3 279 360 byte). Ya, frame, dalam biner, yang dikeluarkan dari fb0 adalah RGBA di perangkat saya. Ini kemungkinan besar akan tergantung dari perangkat ke perangkat. Ini akan penting bagi Anda untuk memecahkan kode itu =)
Di perangkat saya / dev / graphics / fb0 izin sehingga hanya root dan pengguna dari grup grafik dapat membaca fb0.
grafis adalah grup terbatas sehingga Anda mungkin hanya akan mengakses fb0 dengan ponsel yang di-root menggunakan perintah su.
Aplikasi Android memiliki id pengguna (uid) = app _ ## dan id grup (guid) = app _ ## .
adb shell memiliki uid = shell dan guid = shell , yang memiliki lebih banyak izin daripada aplikasi. Anda sebenarnya dapat memeriksa izin tersebut di /system/permissions/platform.xml
Ini berarti Anda akan dapat membaca fb0 di adb shell tanpa root tetapi Anda tidak akan membacanya di dalam aplikasi tanpa root.
Juga, memberikan izin READ_FRAME_BUFFER dan / atau ACCESS_SURFACE_FLINGER di AndroidManifest.xml tidak akan melakukan apa pun untuk aplikasi reguler karena ini hanya akan berfungsi untuk aplikasi ' tanda tangan '.
Periksa juga utas tertutup ini untuk detail lebih lanjut.
sumber
Solusi saya adalah:
dan
Gambar disimpan dalam folder penyimpanan eksternal.
sumber
view
Anda sampaikanImageUtils.loadBitmapFromView(this, view)
?Anda dapat mencoba perpustakaan berikut ini: http://code.google.com/p/android-screenshot-library/ Android Screenshot Library (ASL) memungkinkan untuk menangkap tangkapan layar dari perangkat Android secara terprogram tanpa persyaratan memiliki hak akses root. Sebaliknya, ASL menggunakan layanan asli yang berjalan di latar belakang, dimulai melalui Android Debug Bridge (ADB) satu kali per boot perangkat.
sumber
Berdasarkan jawaban @JustinMorris di atas dan @NiravDangi di sini https://stackoverflow.com/a/8504958/2232148 kita harus mengambil latar belakang dan latar depan tampilan dan mengumpulkannya seperti ini:
Parameter kualitas mengambil konstanta Bitmap.Config, biasanya salah satu
Bitmap.Config.RGB_565
atauBitmap.Config.ARGB_8888
.sumber
TAMBAHKAN IZIN
sumber
Anda dapat mencoba melakukan sesuatu seperti ini,
Mendapatkan cache bitmap dari tata letak atau tampilan dengan melakukan sesuatu seperti Pertama, Anda harus
setDrawingCacheEnabled
menggunakan tata letak (linearlayout atau relativelayout, atau tampilan)kemudian
Kemudian Anda melakukan apa pun yang Anda inginkan dengan bitmap. Baik mengubahnya menjadi file gambar, atau mengirim uri bitmap ke tempat lain.
sumber
Bagi mereka yang ingin menangkap GLSurfaceView, metode getDrawingCache atau menggambar ke kanvas tidak akan berfungsi.
Anda harus membaca konten framebuffer OpenGL setelah bingkai dibuat. Ada jawaban yang bagus di sini
sumber
Saya telah membuat perpustakaan sederhana yang mengambil tangkapan layar dari
View
dan memberi Anda objek Bitmap atau menyimpannya langsung ke jalur apa pun yang Anda inginkanhttps://github.com/abdallahalaraby/Blink
sumber
Screenshot.takeScreenshot(view, mPath); imageView.setImageBitmap(Screenshot.getBitmapScreenshot(view, mPath));
bagaimana cara mendapatkan aktivitas saat ini. Saya tidak ingin menggunakan id xml.takeScreenshotForScreen()
saja.Jalan pintas adalah
sumber
Hanya memperluas jawaban taraloca. Anda harus menambahkan baris berikut untuk membuatnya berfungsi. Saya telah membuat nama gambar statis. Pastikan Anda menggunakan variabel cap waktu taraloca jika Anda membutuhkan nama gambar dinamis.
Dan dalam file AndroidManifest.xml entri berikut harus:
sumber
Jika Anda ingin mengambil tangkapan layar dari
fragment
ikuti ini:Timpa
onCreateView()
:Logika untuk mengambil tangkapan layar:
metode
shareScreenShotM)()
:metode takeScreenShot ():
metode savePic ():
Untuk aktivitas, Anda cukup menggunakan
View v1 = getWindow().getDecorView().getRootView();
sajamView
sumber
Sebagian besar jawaban untuk pertanyaan ini menggunakan
Canvas
metode menggambar atau menggambar metode cache. Namun,View.setDrawingCache()
metode ini tidak digunakan lagi dalam API 28 . Saat ini API yang direkomendasikan untuk membuat tangkapan layar adalahPixelCopy
kelas yang tersedia dari API 24 (tetapi metode yang menerimaWindow
parameter tersedia dari API 26 == Android 8.0 Oreo). Berikut ini contoh kode Kotlin untuk mengambilBitmap
:sumber
Hanya untuk aplikasi sistem!
Catatan: Aplikasi sistem tidak perlu menjalankan "su" untuk menjalankan perintah ini.
sumber
Tampilan parameter adalah objek tata letak root.
sumber
Untuk Screenshot Scrolling Halaman Penuh
Jika Anda ingin mengambil tangkapan layar Lihat penuh (Yang berisi scrollview atau lebih) maka periksa di perpustakaan ini
Yang harus Anda lakukan adalah mengimpor Gradel, dan membuat objek BigScreenshot
BigScreenshot longScreenshot = new BigScreenshot(this, x, y);
Panggilan balik akan diterima dengan bitmap dari Screenshot yang diambil saat secara otomatis menggulir grup tampilan layar dan pada akhirnya dikumpulkan bersama.
@Override public void getScreenshot(Bitmap bitmap) {}
Yang dapat disimpan ke galeri atau penggunaan apa pun diperlukan setelah mereka
sumber
Ambil tangkapan layar tampilan di android.
sumber
jika Anda ingin menangkap tampilan atau tata letak seperti RelativeLayout atau LinearLayout dll. gunakan saja kode:
sekarang Anda dapat menyimpan bitmap ini di penyimpanan perangkat dengan:
sumber