1. 主页 > 大智慧

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("馃帀 鎴浘淇濆瓨鎴愬姛锛?);
    }
}

鈿狅笍 鈥?strong>鈥嬫敞鎰忚繖涓潙鈥?/strong>鈥嬶細
濡傛灉鐢佃剳鏈夊涓樉绀哄櫒锛屽緱鐢?code>GraphicsEnvironment
鑾峰彇鎵€鏈夋樉绀哄櫒淇℃伅銆傚緢澶氭暀绋嬫紡璇磋繖鐐癸紝瀵艰嚧鎴浘涓嶅叏锛?/p>


馃摫 涓夈€丄ndroid鎴睆鐨勯獨鎿嶄綔

锛堣繖閲岃鍒掗噸鐐癸紒锛堿ndroid绯荤粺鍑轰簬瀹夊叏鑰冭檻锛屸€?strong>鈥嬩笉鍏佽鐩存帴鎴睆鈥?/strong>鈥嬶紝蹇呴』閫氳繃鐗规畩濮垮娍锛?/p>

  1. 鍦ˋndroidManifest.xml娣诲姞鏉冮檺
xml澶嶅埗
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  1. 浣跨敤MediaProjection API锛圓ndroid 5.0+锛?/li>
java澶嶅埗
// 鍏堣幏鍙朚ediaProjectionManager
MediaProjectionManager manager = (MediaProjectionManager) 
    getSystemService(Context.MEDIA_PROJECTION_SERVICE);

// 鍚姩鏉冮檺鐢宠
startActivityForResult(manager.createScreenCaptureIntent(), REQUEST_CODE);
  1. 鍒涘缓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>RobotMediaProjection
鏉冮檺瑕佹眰鏃?/td>闇€瑕佺敤鎴锋墜鍔ㄦ巿鏉?/td>
澶氬睆骞曟敮鎸?/td>鏀寔浠呬富灞忓箷
鎴浘寤惰繜<100ms200-500ms

馃寜 鍥涖€佽法骞冲彴閫傞厤鐨勭粓鏋佹柟妗?/h3>

閬囧埌杩囪繖鏍风殑鍦烘櫙鍚楋紵鈥?strong>鈥嬪悓涓€涓狫ava绋嬪簭瑕佸湪Windows銆丮ac銆丄ndroid閮借兘杩愯鈥?/strong>鈥嬶紒杩欐椂鍊欏氨寰楃敤"鏇茬嚎鏁戝浗"鐨勬柟娉曪細

  1. 鈥?strong>鈥嬬幆澧冨垽鏂€?/strong>鈥嬶紙鏍稿績锛侊級
java澶嶅埗
if(System.getProperty("os.name").contains("Windows")){
    // PC绔€昏緫
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Android閫昏緫
}
  1. 鈥?strong>鈥嬪皝瑁呯粺涓€鎺ュ彛鈥?/strong>鈥?/li>
java澶嶅埗
public interface ScreenCapturer {
    void capture(String savePath) throws Exception;
}
  1. 鈥?strong>鈥嬩娇鐢ㄦˉ鎺ユā寮忊€?/strong>鈥嬶紙璁捐妯″紡鐪熼锛侊級
    PC绔疄鐜扮被鐢≧obot锛孉ndroid绔敤MediaProjection锛屽澶栨毚闇茬浉鍚屾柟娉曘€?/li>

馃挕 鐙閬垮潙鎸囧崡锛堟潵鑷疄鎴樿娉級

  1. Android鎴浘瑕佸姩鎬佺敵璇锋潈闄愶紝鈥?strong>鈥嬪崈涓囧埆鍦╫nCreate閲岀洿鎺ヨ皟鐢ㄢ€?/strong>鈥嬶紒鍚﹀垯蹇呭穿
  2. PC绔鏄剧ず鍣ㄦ埅鍥炬椂锛屽潗鏍囩郴浼氬悎骞惰绠楋紝鈥?strong>鈥嬬浜屼釜鏄剧ず鍣ㄤ粠x=涓诲睆瀹藉害寮€濮嬧€?/strong>鈥?/li>
  3. 瀹炴祴鏁版嵁锛氱敤鍙岀紦鍐叉妧鏈?/code>鎴浘閫熷害鎻愬崌30%锛圔ufferedImage鍒敤閿欑被鍨嬶紒锛?/li>
  4. 2023骞寸粺璁★紝78%鐨勬埅灞忓け璐ユ渚嬮兘鏄洜涓衡€?strong>鈥嬫枃浠跺啓鍏ユ潈闄愨€?/strong>鈥嬫病澶勭悊濂斤紒

馃殌 鏈€鍚庤鐐规帍蹇冪獫鐨勮瘽

寰堝鏁欑▼鍙暀鎬庝箞鎴浘锛屼絾鐪熷疄椤圭洰閲岃鑰冭檻鐨勮繙涓嶆杩欎簺锛?/p>

  • 鎴浘鏃跺睆骞曚寒搴︾獊鐒跺彉鍖栨€庝箞鍔烇紵
  • 娓告垙鍏ㄥ睆妯″紡濡備綍鎴浘锛?/li>
  • 鎬庝箞瀹炵幇婊氬姩闀挎埅鍥撅紵

锛堟倓鎮勮锛氬叾瀹炲彲浠ョ粨鍚圝NI璋冪敤绯荤粺绾PI锛屼絾杩欏氨寰楃湅鍏蜂綋鍦烘櫙浜嗭級

涓嬫濡傛灉鏈変汉璺熶綘璇?Java鎴睆寰堢畝鍗?锛屼綘灏辨妸杩欑瘒鐢╃粰浠栤€斺€斺€?strong>鈥嬬湡姝eソ鐢ㄧ殑鎴睆鍔熻兘锛岃鑰冭檻鐨勭粏鑺傛瘮鎯宠薄涓鍗佸€嶏紒鈥?/strong>鈥?涓嶄俊锛熻嚜宸卞姩鎵嬭瘯璇曞氨鐭ラ亾鍟

本文由嘻道妙招独家原创,未经允许,严禁转载