鈥嬬▼搴忓寲鎴浘鍦ㄧ" />
  1. 主页 > 好文章

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)
}

鈿狅笍 鈥?strong>鈥嬫敞鎰忚繖涓潙鈥?/strong>鈥嬶細
杩欑鏂规硶鍙兘鎴彇褰撳墠Activity鐨勫唴瀹癸紝濡傛灉鏄脊绐楁垨鑰呮偓娴獥...鍢垮樋锛屾姄鐬庝簡鍚э紵寰€涓嬬湅杩涢樁鐗堬紒


馃殌 涓夈€佸疄鎴樿繘闃讹細鍏ㄥ睆鎴浘锛堝寘鎷郴缁熺晫闈級

闇€瑕佺敤鍒癕ediaProjection API锛屾祦绋嬫湁鐐瑰鏉傦紝浣嗗挶鎷嗗紑璇达細

  1. 鈥?strong>鈥嬫潈闄愮敵璇蜂笁浠跺鈥?/strong>鈥嬶細
xml澶嶅埗

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  1. 鈥?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浠ヤ笂


馃挕 鐙鎬ц兘浼樺寲绉樼睄

  1. 鈥?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);
    }
});
  1. 鈥?strong>鈥嬪唴瀛樼鐞嗏€?/strong>鈥嬶細瀹炴祴鍙戠幇锛屼笉鍙婃椂鍥炴敹Bitmap浼氬鑷碠OM锛堝唴瀛樻孩鍑猴級锛屽缓璁敤WeakReference灏佽

  2. 鈥?strong>鈥?023骞村疄娴嬫暟鎹€?/strong>鈥嬶細

  • 浣跨敤MediaProjection+ImageReader缁勫悎锛屾埅鍥惧欢杩熸渶浣庡彲杈?3ms
  • 鍗庝负Mate50鎴浘鎴愬姛鐜囦粠67%鎻愬崌鍒?2%鐨勭璇€锛氬湪鎴浘鍓嶄富鍔ㄨЕ鍙戜竴娆I閲嶇粯

馃幃 瀹炴垬妗堜緥锛氭父鎴忚嚜鍔ㄦ埅鍥惧伐鍏?/h3>

锛堣繖鍙槸鎺ョ娲荤殑甯歌闇€姹傦紒锛?/p>

  1. 鈥?strong>鈥嬬洃鍚父鎴忓緱鍒嗗彉鍖栤€?/strong>鈥嬶細
java澶嶅埗
// 閫氳繃AccessibilityService鐩戞帶鐣岄潰鍙樺寲
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    if(event.getClassName().equals("com.game.ScoreView")) {
        takeScreenshot(); // 瑙﹀彂鎴浘
    }
}
  1. 鈥?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>鈥嬨€傛悶涓嶅畾鐨勬椂鍊?..浣犳噦鐨勶紝鍔犱釜寤惰繜璇曡瘯锛熻涓嶅畾鏈夋儕鍠滐紒

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