這篇文章給大家介紹Android中怎么實現一個截屏功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
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中怎么實現一個截屏功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。