国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Android實現截屏功能

瀏覽:7日期:2022-09-17 15:13:38
導言

目前截屏的方法很多,root不適用,要么其他方法就是有局限性,而其中官方給出的方案最好—MediaProjection

介紹

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

步驟

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

1:build.gradle

compileSdkVersion 21 buildToolsVersion ’27.0.3’ defaultConfig {applicationId 'com.aile.screenshot'multiDexEnabled trueminSdkVersion 21targetSdkVersion 21versionCode 1versionName '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() {@Overridepublic void run() { stopVirtual(); tearDownMediaProjection();} }, 0);} }public class SaveTask extends AsyncTask<Image, Void, Bitmap> {@Overrideprotected 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;}@Overrideprotected 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);} }

8:還有很多,只需按照需求走就OK,沒有難的東西,需要不停的學習和積累

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 亚洲男人a天堂在线2184 | 国产成人毛片精品不卡在线 | 国内自拍网站 | 女人张开腿男人猛桶视频 | 亚洲欧美在线视频免费 | 亚洲天堂色网站 | 成人欧美一区二区三区黑人免费 | 中文字幕亚洲日本岛国片 | 99久免费精品视频在线观看2 | 免费一级欧美片片线观看 | 中国美女一级黄色片 | 一级a毛片 | 中文乱码一二三四有限公司 | 久草成人在线视频 | 国产区精品 | 国产亚洲精品一区二区在线播放 | 特级a欧美做爰片毛片 | 亚洲福利视频精选在线视频 | 国产一区二区三区久久小说 | 久久福利青草精品资源 | 加勒比一本大道香蕉在线视频 | 国产99视频精品免费视频7 | 久久久久女人精品毛片九一 | 毛片在线视频观看 | 日韩在线中文 | 欧美老熟妇bbbb毛片 | 日韩在线资源 | 国产精品91av | 国产精品国产三级国产普通 | 久久久精品久久久久久久久久久 | 亚洲免费久久 | 日本亚洲欧美国产日韩ay高清 | 精品成人 | 成人伊人 | 天天躁夜夜躁狠狠躁2024 | 亚洲一区二区三区中文字幕 | 2020久久国产最新免费观看 | 免费被黄网站在观看 | 国产a国产片国产 | 欧洲成人全免费视频网站 | 成人av手机在线观看 |