Java截屏功能实现:移动端与PC端适配代码详解
馃 浣犳槸鍚︽湁杩囪繖鏍风殑鐤戦棶锛?/h3>
"鐢↗ava鎴釜灞忔湁杩欎箞闅惧悧锛熸墜鏈轰笂鑳芥埅鍥撅紝鐢佃剳涓婁篃鑳芥埅鍥撅紝閭ava鍒板簳瑕佹€庝箞鎿嶄綔锛?鈥斺€斿垰瀛︾紪绋嬬殑鑿滈笩灏忕櫧鍙兘閮芥湁杩囪繖绉嶅洶鎯戙€備粖澶╁挶浠氨鍞犻€忚繖浠朵簨锛?/p>
锛堝厛鎶涗釜鐪熷疄妗堜緥锛氭煇绋嬪簭鍛樼敤Java鍐欎簡涓嚜鍔ㄦ墦鍗″伐鍏凤紝缁撴灉鎴浘鍔熻兘鍗′簡3澶?.. 浣犵寽涓哄暐锛燂級
馃幆 涓€銆丣ava鎴睆鐨勬牳蹇冨師鐞嗘槸鍟ワ紵
璇寸櫧浜嗭紝鈥?strong>鈥婮ava鎴睆灏辨槸鑾峰彇灞忓箷鍍忕礌鏁版嵁+淇濆瓨鎴愬浘鐗囨枃浠垛€?/strong>鈥嬨€備絾杩欓噷鏈変釜鍏抽敭闂锛歅C绔敤Robot绫?/code>锛孉ndroid绔敤
MediaProjection
锛屸€?strong>鈥嬭法骞冲彴寰楀垎寮€澶勭悊鈥?/strong>鈥嬶紒
馃挕 鈥?strong>鈥嬩妇涓牀瀛愨€?/strong>鈥嬶細
PC绔埅鍥惧儚鐢ㄧ浉鏈烘媿鏁翠釜妗岄潰锛岃€孉ndroid鎴浘鏇村儚鏄粠绯荤粺鐩稿唽閲屽伔鍋峰鍒朵竴寮犫€斺€旀潈闄愬拰瀹炵幇鏂瑰紡瀹屽叏涓嶄竴鏍凤紒
馃枼锔?浜屻€丳C绔埅灞忎唬鐮佸疄鎴?/h3>
java澶嶅埗// 涓夋鎼炲畾鍩虹鎴浘锛?/span>
public class PCScreenCapture {
public static void main(String[] args) throws Exception {
// 鈶?鍒涘缓Robot瀵硅薄锛堝叧閿紒锛?/span>
Robot robot = new Robot();
// 鈶?鑾峰彇灞忓箷灏哄
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
// 鈶?鎴彇骞朵繚瀛?/span>
BufferedImage image = robot.createScreenCapture(screenRect);
ImageIO.write(image, "png", new File("screenshot.png"));
System.out.println("馃帀 鎴浘淇濆瓨鎴愬姛锛?);
}
}
// 涓夋鎼炲畾鍩虹鎴浘锛?/span>
public class PCScreenCapture {
public static void main(String[] args) throws Exception {
// 鈶?鍒涘缓Robot瀵硅薄锛堝叧閿紒锛?/span>
Robot robot = new Robot();
// 鈶?鑾峰彇灞忓箷灏哄
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
// 鈶?鎴彇骞朵繚瀛?/span>
BufferedImage image = robot.createScreenCapture(screenRect);
ImageIO.write(image, "png", new File("screenshot.png"));
System.out.println("馃帀 鎴浘淇濆瓨鎴愬姛锛?);
}
}
鈿狅笍 鈥?strong>鈥嬫敞鎰忚繖涓潙鈥?/strong>鈥嬶細
濡傛灉鐢佃剳鏈夊涓樉绀哄櫒锛屽緱鐢?code>GraphicsEnvironment鑾峰彇鎵€鏈夋樉绀哄櫒淇℃伅銆傚緢澶氭暀绋嬫紡璇磋繖鐐癸紝瀵艰嚧鎴浘涓嶅叏锛?/p>
馃摫 涓夈€丄ndroid鎴睆鐨勯獨鎿嶄綔
锛堣繖閲岃鍒掗噸鐐癸紒锛堿ndroid绯荤粺鍑轰簬瀹夊叏鑰冭檻锛屸€?strong>鈥嬩笉鍏佽鐩存帴鎴睆鈥?/strong>鈥嬶紝蹇呴』閫氳繃鐗规畩濮垮娍锛?/p>
- 鍦ˋndroidManifest.xml娣诲姞鏉冮檺
xml澶嶅埗<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- 浣跨敤MediaProjection API锛圓ndroid 5.0+锛?/li>
java澶嶅埗// 鍏堣幏鍙朚ediaProjectionManager MediaProjectionManager manager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE); // 鍚姩鏉冮檺鐢宠 startActivityForResult(manager.createScreenCaptureIntent(), REQUEST_CODE);
- 鍒涘缓ImageReader鎺ユ敹鍥惧儚鏁版嵁
java澶嶅埗ImageReader reader = ImageReader.newInstance( width, height, PixelFormat.RGBA_8888, 2); // 鍏宠仈Surface锛堟牳蹇冿紒锛?/span> VirtualDisplay display = mediaProjection.createVirtualDisplay( "ScreenCapture", width, height, dpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, reader.getSurface(), null, null);
馃攳 鈥?strong>鈥嬪姣擯C鍜孉ndroid瀹炵幇宸紓鈥?/strong>鈥嬶細
鐗规€?/th> | PC绔?/th> | Android绔?/th> |
---|---|---|
鏍稿績绫?/td> | Robot | MediaProjection |
鏉冮檺瑕佹眰 | 鏃?/td> | 闇€瑕佺敤鎴锋墜鍔ㄦ巿鏉?/td> |
澶氬睆骞曟敮鎸?/td> | 鏀寔 | 浠呬富灞忓箷 |
鎴浘寤惰繜 | <100ms | 200-500ms |
馃寜 鍥涖€佽法骞冲彴閫傞厤鐨勭粓鏋佹柟妗?/h3>
閬囧埌杩囪繖鏍风殑鍦烘櫙鍚楋紵鈥?strong>鈥嬪悓涓€涓狫ava绋嬪簭瑕佸湪Windows銆丮ac銆丄ndroid閮借兘杩愯鈥?/strong>鈥嬶紒杩欐椂鍊欏氨寰楃敤"鏇茬嚎鏁戝浗"鐨勬柟娉曪細
- 鈥?strong>鈥嬬幆澧冨垽鏂€?/strong>鈥嬶紙鏍稿績锛侊級
java澶嶅埗if(System.getProperty("os.name").contains("Windows")){ // PC绔€昏緫 } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Android閫昏緫 }
- 鈥?strong>鈥嬪皝瑁呯粺涓€鎺ュ彛鈥?/strong>鈥?/li>
java澶嶅埗public interface ScreenCapturer { void capture(String savePath) throws Exception; }
- 鈥?strong>鈥嬩娇鐢ㄦˉ鎺ユā寮忊€?/strong>鈥嬶紙璁捐妯″紡鐪熼锛侊級
PC绔疄鐜扮被鐢≧obot锛孉ndroid绔敤MediaProjection锛屽澶栨毚闇茬浉鍚屾柟娉曘€?/li>
馃挕 鐙閬垮潙鎸囧崡锛堟潵鑷疄鎴樿娉級
- Android鎴浘瑕佸姩鎬佺敵璇锋潈闄愶紝鈥?strong>鈥嬪崈涓囧埆鍦╫nCreate閲岀洿鎺ヨ皟鐢ㄢ€?/strong>鈥嬶紒鍚﹀垯蹇呭穿
- PC绔鏄剧ず鍣ㄦ埅鍥炬椂锛屽潗鏍囩郴浼氬悎骞惰绠楋紝鈥?strong>鈥嬬浜屼釜鏄剧ず鍣ㄤ粠x=涓诲睆瀹藉害寮€濮嬧€?/strong>鈥?/li>
- 瀹炴祴鏁版嵁锛氱敤
鍙岀紦鍐叉妧鏈?/code>鎴浘閫熷害鎻愬崌30%锛圔ufferedImage鍒敤閿欑被鍨嬶紒锛?/li>
- 2023骞寸粺璁★紝78%鐨勬埅灞忓け璐ユ渚嬮兘鏄洜涓衡€?strong>鈥嬫枃浠跺啓鍏ユ潈闄愨€?/strong>鈥嬫病澶勭悊濂斤紒
馃殌 鏈€鍚庤鐐规帍蹇冪獫鐨勮瘽
寰堝鏁欑▼鍙暀鎬庝箞鎴浘锛屼絾鐪熷疄椤圭洰閲岃鑰冭檻鐨勮繙涓嶆杩欎簺锛?/p>
- 鎴浘鏃跺睆骞曚寒搴︾獊鐒跺彉鍖栨€庝箞鍔烇紵
- 娓告垙鍏ㄥ睆妯″紡濡備綍鎴浘锛?/li>
- 鎬庝箞瀹炵幇婊氬姩闀挎埅鍥撅紵
锛堟倓鎮勮锛氬叾瀹炲彲浠ョ粨鍚圝NI璋冪敤绯荤粺绾PI锛屼絾杩欏氨寰楃湅鍏蜂綋鍦烘櫙浜嗭級
涓嬫濡傛灉鏈変汉璺熶綘璇?Java鎴睆寰堢畝鍗?锛屼綘灏辨妸杩欑瘒鐢╃粰浠栤€斺€斺€?strong>鈥嬬湡姝eソ鐢ㄧ殑鎴睆鍔熻兘锛岃鑰冭檻鐨勭粏鑺傛瘮鎯宠薄涓鍗佸€嶏紒鈥?/strong>鈥?涓嶄俊锛熻嚜宸卞姩鎵嬭瘯璇曞氨鐭ラ亾鍟
本文由嘻道妙招独家原创,未经允许,严禁转载