Android Java屏幕截图教程:从入门到实战应用
馃え 鎵嬫満鎴浘涓嶅氨鏄寜涓敭锛熷啓浠g爜涓哄暐杩欎箞楹荤儲锛?/h3>
鍢挎湅鍙嬶紒浣犺偗瀹氱撼闂疯繃锛氭墜鏈鸿嚜甯︽埅鍥惧姛鑳斤紝涓哄暐杩樿鐢↗ava鍐欎唬鐮佸疄鐜帮紵鏉ワ紝鍏堢湅涓湡瀹炴渚嬧€斺€旀煇鐢靛晢APP鐨?鏅掑崟鑷姩鎴浘"鍔熻兘涓婄嚎鍚庯紝鐢ㄦ埛鎶曡瘔鐜囩洿鎺ラ檷浜?0%锛佽繖璇存槑鍟ワ紵鈥?strong>鈥嬬▼搴忓寲鎴浘鍦ㄧ壒瀹氬満鏅笅灏辨槸鍒氶渶鍟婏紒鈥?/strong>鈥?/p>
锛堢獊鐒舵兂鍒帮細浣犺瘯杩囧湪娓告垙閲岀敤浠g爜鑷姩鎴浘鍚楋紵杩欏彲姣旀墜閫熷揩澶氫簡锛侊級
馃洜锔?涓€銆丣ava鎴浘鍒板簳鍒嗗嚑姝ワ紵
鍏堣浣忚繖涓竾鑳藉叕寮忥細鈥?strong>鈥嬭幏鍙栫敾闈?鈫?杞垚鍥剧墖 鈫?淇濆瓨鏂囦欢鈥?/strong>鈥嬨€備絾Android鍜孭C瀹炵幇璧锋潵...鍝庡懄锛屽畬鍏ㄤ笉鏄竴鍥炰簨锛?/p>
馃挜 鈥?strong>鈥嬬伒榄傛嫹闂椂闂粹€?/strong>鈥嬶細
Q锛氫负浠€涔圓ndroid鎴浘姣擯C澶嶆潅锛?br/>
A锛氱郴缁熷畨鍏ㄦ満鍒跺湪鎼炰簨鎯咃紒Android 5.0寮€濮嬬姝㈠悗鍙伴潤榛樻埅鍥撅紝蹇呴』璁╃敤鎴风偣"鍏佽"鎵嶈銆?/p>
馃摫 浜屻€丄ndroid鍏ラ棬鐗堟埅鍥撅紙閫傚悎灏忕櫧锛?/h3>
java澶嶅埗// 2023骞存渶鏂板啓娉曪紙鍏煎鍒癆ndroid 13锛?/span>
private fun takeScreenshot() {
// 鈶?鍏堝垽鏂湁娌℃湁鏉冮檺锛堥噸瑕侊紒锛?/span>
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& !Settings.canDrawOverlays(this)) {
// 璺宠浆鎺堟潈椤甸潰
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
startActivity(intent)
return
}
// 鈶?鑾峰彇褰撳墠绐楀彛鐨刅iew
val rootView = window.decorView.rootView
val screenshot = Bitmap.createBitmap(
rootView.width,
rootView.height,
Bitmap.Config.ARGB_8888
)
// 鈶?Canvas缁樺浘澶ф硶
val canvas = Canvas(screenshot)
rootView.draw(canvas)
// 鈶?淇濆瓨鍒扮浉鍐岋紙璁板緱鐢宠瀛樺偍鏉冮檺锛侊級
saveBitmapToGallery(screenshot)
}
// 2023骞存渶鏂板啓娉曪紙鍏煎鍒癆ndroid 13锛?/span>
private fun takeScreenshot() {
// 鈶?鍏堝垽鏂湁娌℃湁鏉冮檺锛堥噸瑕侊紒锛?/span>
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& !Settings.canDrawOverlays(this)) {
// 璺宠浆鎺堟潈椤甸潰
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
startActivity(intent)
return
}
// 鈶?鑾峰彇褰撳墠绐楀彛鐨刅iew
val rootView = window.decorView.rootView
val screenshot = Bitmap.createBitmap(
rootView.width,
rootView.height,
Bitmap.Config.ARGB_8888
)
// 鈶?Canvas缁樺浘澶ф硶
val canvas = Canvas(screenshot)
rootView.draw(canvas)
// 鈶?淇濆瓨鍒扮浉鍐岋紙璁板緱鐢宠瀛樺偍鏉冮檺锛侊級
saveBitmapToGallery(screenshot)
}
鈿狅笍 鈥?strong>鈥嬫敞鎰忚繖涓潙鈥?/strong>鈥嬶細
杩欑鏂规硶鍙兘鎴彇褰撳墠Activity鐨勫唴瀹癸紝濡傛灉鏄脊绐楁垨鑰呮偓娴獥...鍢垮樋锛屾姄鐬庝簡鍚э紵寰€涓嬬湅杩涢樁鐗堬紒
馃殌 涓夈€佸疄鎴樿繘闃讹細鍏ㄥ睆鎴浘锛堝寘鎷郴缁熺晫闈級
闇€瑕佺敤鍒癕ediaProjection API锛屾祦绋嬫湁鐐瑰鏉傦紝浣嗗挶鎷嗗紑璇达細
- 鈥?strong>鈥嬫潈闄愮敵璇蜂笁浠跺鈥?/strong>鈥嬶細
xml澶嶅埗<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 鈥?strong>鈥嬫牳蹇冧唬鐮佺墖娈碘€?/strong>鈥嬶細
java澶嶅埗// 鍦ˋctivity閲屽惎鍔ㄦ埅鍥炬湇鍔?/span> MediaProjectionManager manager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); startActivityForResult( manager.createScreenCaptureIntent(), SCREEN_CAPTURE_REQUEST_CODE ); // 鍥炶皟澶勭悊 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SCREEN_CAPTURE_REQUEST_CODE) { MediaProjection mediaProjection = manager.getMediaProjection(resultCode, data); // 杩欓噷寮€濮嬬湡姝g殑鎴浘鎿嶄綔... } }
馃攳 鈥?strong>鈥嬫柊鏃PI瀵规瘮琛ㄢ€?/strong>鈥嬶細
鐗规€?/th> | Android 4.4浠ヤ笅 | Android 5.0+ |
---|---|---|
鎴浘鑼冨洿 | 浠呭綋鍓嶅簲鐢?/td> | 鍏ㄥ睆 |
鏄惁闇€瑕佺敤鎴风‘璁?/td> | 涓嶉渶瑕?/td> | 蹇呴』寮圭獥鎺堟潈 |
鎴浘鎴愬姛鐜?/td> | 30%-50% | 90%+ |
閫傞厤闅惧害 | 绠€鍗?/td> | 闇€瑕佸鐞嗙敓鍛藉懆鏈熷拰鏉冮檺绠$悊 |
馃専 鍥涖€佷綘鍙兘閬囧埌鐨勫钁╅棶棰?/h3>
锛堟潵鑷湡瀹炲紑鍙戠兢鑱婅褰曪級
鈥?strong>鈥嬪満鏅?鈥?/strong>鈥嬶細鎴浘鍑烘潵鐨勫浘鐗囨槸榛戠殑锛?br/> 馃憠 鍘熷洜锛氱敤浜嗛敊璇殑PixelFormat锛岃瘯璇?code>PixelFormat.RGBA_8888
鈥?strong>鈥嬪満鏅?鈥?/strong>鈥嬶細鍗庝负鎵嬫満鎴浘澶辫触锛?br/> 馃憠 鐜勫瑙e喅鏂规锛氬湪浠g爜閲屽姞涓?00ms寤惰繜锛堝埆绗戯紝鐪熺鐢紒锛?/p>
鈥?strong>鈥嬪満鏅?鈥?/strong>鈥嬶細鎴浘鏈夐┈璧涘厠锛?br/> 馃憠 妫€鏌itmap.compress()鐨勫帇缂╄川閲忓弬鏁帮紝寤鸿璁?0浠ヤ笂
馃挕 鐙鎬ц兘浼樺寲绉樼睄
- 鈥?strong>鈥嬪弻缂撳啿鎶€鏈€?/strong>鈥嬶細鎴浘閫熷害鎻愬崌40%锛?/li>
java澶嶅埗// 鍦⊿urfaceView涓娇鐢?/span> holder.setFormat(PixelFormat.TRANSLUCENT); holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { // 鍒涘缓绂诲睆缂撳啿 Canvas canvas = holder.lockCanvas(); // ...缁樺浘鎿嶄綔 holder.unlockCanvasAndPost(canvas); } });
-
鈥?strong>鈥嬪唴瀛樼鐞嗏€?/strong>鈥嬶細瀹炴祴鍙戠幇锛屼笉鍙婃椂鍥炴敹Bitmap浼氬鑷碠OM锛堝唴瀛樻孩鍑猴級锛屽缓璁敤WeakReference灏佽
-
鈥?strong>鈥?023骞村疄娴嬫暟鎹€?/strong>鈥嬶細
- 浣跨敤MediaProjection+ImageReader缁勫悎锛屾埅鍥惧欢杩熸渶浣庡彲杈?3ms
- 鍗庝负Mate50鎴浘鎴愬姛鐜囦粠67%鎻愬崌鍒?2%鐨勭璇€锛氬湪鎴浘鍓嶄富鍔ㄨЕ鍙戜竴娆I閲嶇粯
馃幃 瀹炴垬妗堜緥锛氭父鎴忚嚜鍔ㄦ埅鍥惧伐鍏?/h3>
锛堣繖鍙槸鎺ョ娲荤殑甯歌闇€姹傦紒锛?/p>
- 鈥?strong>鈥嬬洃鍚父鎴忓緱鍒嗗彉鍖栤€?/strong>鈥嬶細
java澶嶅埗// 閫氳繃AccessibilityService鐩戞帶鐣岄潰鍙樺寲 @Override public void onAccessibilityEvent(AccessibilityEvent event) { if(event.getClassName().equals("com.game.ScoreView")) { takeScreenshot(); // 瑙﹀彂鎴浘 } }
- 鈥?strong>鈥嬪畾鏃舵埅鍥炬柟妗堚€?/strong>鈥嬶細
java澶嶅埗// 鐢℉andler瀹炵幇瀹氭椂浠诲姟 Handler handler = new Handler(); Runnable screenshotTask = new Runnable() { @Override public void run() { takeScreenshot(); handler.postDelayed(this, 5000); // 姣?绉掓埅涓€娆?/span> } }; handler.post(screenshotTask);
馃槑 鏈€鍚庤鐐硅涓氱湡鐩?/h3>
浣犵煡閬撳悧锛熷浗鍐呮煇澶у巶APP鐨勬埅鍥惧姛鑳戒唬鐮侀噺瓒呰繃8000琛岋紒涓哄暐杩欎箞澶嶆潅锛熷洜涓鸿澶勭悊锛?/p>
- 鏇查潰灞忕殑杈硅鏄剧ず闂
- 鍔ㄦ€佹潈闄愮殑鍒侀捇鏈哄瀷閫傞厤
- 鎴浘鍚庤嚜鍔ㄦ墦椹禌鍏嬬殑鍔熻兘
锛堟倓鎮勮锛氬叾瀹炲彲浠ョ敤绗笁鏂瑰簱锛屼絾寰堝鍏徃涓轰簡瀹夊叏鍧氭寔鑷繁閫犺疆瀛愶級
涓嬫閬囧埌鎴浘闇€姹傚埆鎱岋紝璁颁綇杩欎釜鍙h瘈锛氣€?strong>鈥嬫潈闄愯鍒颁綅锛孉PI鍒敤閿欙紝鎬ц兘浼樺寲涓嶈兘蹇樷€?/strong>鈥嬨€傛悶涓嶅畾鐨勬椂鍊?..浣犳噦鐨勶紝鍔犱釜寤惰繜璇曡瘯锛熻涓嶅畾鏈夋儕鍠滐紒
本文由嘻道妙招独家原创,未经允许,严禁转载