91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android如何實現截屏功能

發布時間:2022-03-30 10:54:08 來源:億速云 閱讀:563 作者:iii 欄目:移動開發

本文小編為大家詳細介紹“Android如何實現截屏功能”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Android如何實現截屏功能”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

介紹

Android 5.0以后開放的錄屏API,取視頻中的一幀數據,這樣就可以實現截屏

步驟

在activity中授權,在service中完成初始化并截圖,當然可以后臺定時截圖,但是6.0系統會有內存溢出的bug

1:build.gradle

compileSdkVersion 21
    buildToolsVersion "27.0.3"

    defaultConfig {
        applicationId "com.aile.screenshot"
        multiDexEnabled true
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

2:在activity中授權

public void requestCapturePermission() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            return;
        }
        MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case REQUEST_MEDIA_PROJECTION:
                if (resultCode == RESULT_OK && data != null) {
                    Service.setResultData(data);
                    startService(new Intent(this, Service.class));
                    finish();
                }
                break;
        }
    }

3:在service中初始化ImageReader,MediaProjection

private void createImageReader() {
        mImageReader = ImageReader.newInstance(mScreenWidth, mScreenHeight, PixelFormat.RGBA_8888, 1);
    }
 public void setUpMediaProjection() {
        mMediaProjection = getMediaProjectionManager().getMediaProjection(Activity.RESULT_OK, mResultData);
        }
    }

4:在service中完成截圖重要步驟:

private void startScreenShot() {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                startVirtual();
            }
        }, 0);

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                startCapture();
            }
        }, 50);
    }
 public void startVirtual() {
        if (mMediaProjection != null) {
            virtualDisplay();
        } else {
            setUpMediaProjection();
            virtualDisplay();
        }
    }
 private void virtualDisplay() {
        mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror",
                mScreenWidth, mScreenHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                mImageReader.getSurface(), null, null);
    }

//異常處理的核心
private void startCapture() {
        Image image = null;
        try {
            image = mImageReader.acquireLatestImage();
        } catch (IllegalStateException e) {
            if (null != image) {
                image.close();
                image = null;
                image = mImageReader.acquireLatestImage();
            }
        }
        if (image == null) {
            startScreenShot();
        } else {
            SaveTask mSaveTask = new SaveTask();
            AsyncTaskCompat.executeParallel(mSaveTask, image);

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    stopVirtual();
                    tearDownMediaProjection();
                }
            }, 0);
        }
    }
public class SaveTask extends AsyncTask<Image, Void, Bitmap> {
        @Override
        protected Bitmap doInBackground(Image... params) {
            if (params == null || params.length < 1 || params[0] == null) {
                return null;
            }
            Image image = params[0];
            int width = image.getWidth();
            int height = image.getHeight();
            final Image.Plane[] planes = image.getPlanes();
            final ByteBuffer buffer = planes[0].getBuffer();
            int pixelStride = planes[0].getPixelStride();
            int rowStride = planes[0].getRowStride();
            int rowPadding = rowStride - pixelStride * width;
            Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);
            bitmap.copyPixelsFromBuffer(buffer);
            //這就是初始截圖
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);
            image.close();
            return bitmap;
        }

        @Override
        protected void onPostExecute(final Bitmap bitmap) {
            super.onPostExecute(bitmap);
            //處理bitmap的業務代碼
    }

5:Bitmap轉IS流,指定區域截圖

// 將Bitmap轉換成InputStream
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
   InputStream inputStream = new ByteArrayInputStream(bos.toByteArray());
//指定區域截圖
   Rect mRect = new Rect(51, 74, 58, 62);
   BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, true);
   Bitmap bm = bitmapRegionDecoder.decodeRegion(mRect, null);

6:定時任務的處理

private Timer timer = new Timer();
 public void shootByTime() {
        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                startScreenShot();
                super.handleMessage(msg);
            }
        };
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = 1;
                handler.sendMessage(message);
            }
        }, 0, 100);
    }

7:橫豎屏的處理

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == this.getResources().getConfiguration().ORIENTATION_PORTRAIT) {
            mRect = new Rect(51, 775, 745, 47);
        } else if (newConfig.orientation == this.getResources().getConfiguration().ORIENTATION_LANDSCAPE) {
            mRect = new Rect(54, 24, 545, 45);
        }
    }

讀到這里,這篇“Android如何實現截屏功能”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

图木舒克市| 和平县| 咸丰县| 永吉县| 德清县| 瑞金市| 无锡市| 苗栗县| 延寿县| 沁水县| 武穴市| 闸北区| 秀山| 肇东市| 西昌市| 商丘市| 东乡族自治县| 平遥县| 江山市| 和龙市| 凤翔县| 尼勒克县| 霞浦县| 泰州市| 峡江县| 宁乡县| 肇东市| 辽中县| 中超| 周至县| 建始县| 江源县| 弥渡县| 吉安县| 体育| 武胜县| 清新县| 凤城市| 永川市| 秦皇岛市| 涪陵区|