用到的API
MediaProjectionManager
MediaProjection
VirtualDisplay
ImageReader
原理:利用Android系统提供的投影功能把屏幕投影到ImageReader
中,通过ImageReader
获取到Bitmap
,调用Bitmap
的getPixel(x, y)
方法获取到指定坐标的颜色。
代码
创建虚拟显示器
private static final int REQUEST_MEDIA_PROJECTION = 1 ;
private MediaProjectionManager mMediaProjectionManager;
private MediaProjection mMediaProjection;
private VirtualDisplay mVirtualDisplay;
@Override
protected void onCreate ( Bundle savedInstanceState) {
super . onCreate ( savedInstanceState) ;
setContentView ( R. layout. activity_main) ;
mMediaProjectionManager = ( MediaProjectionManager) getSystemService ( Context. MEDIA_PROJECTION_SERVICE) ;
assert mMediaProjectionManager != null;
startActivityForResult (
mMediaProjectionManager. createScreenCaptureIntent ( ) ,
REQUEST_MEDIA_PROJECTION) ;
}
@Override
public void onActivityResult ( int requestCode, int resultCode, Intent data) {
if ( requestCode == REQUEST_MEDIA_PROJECTION) {
if ( resultCode != Activity. RESULT_OK) {
Log. i ( TAG, "User cancelled" ) ;
Toast. makeText ( this , "User cancelled!" , Toast. LENGTH_SHORT) . show ( ) ;
return ;
}
Log. i ( TAG, "Starting screen capture" ) ;
mMediaProjection = mMediaProjectionManager. getMediaProjection ( resultCode, data) ;
setUpVirtualDisplay ( ) ;
}
}
private void setUpVirtualDisplay ( ) {
DisplayMetrics dm = new DisplayMetrics ( ) ;
getWindowManager ( ) . getDefaultDisplay ( ) . getRealMetrics ( dm) ;
ImageReader imageReader = ImageReader. newInstance ( dm. widthPixels, dm. heightPixels, PixelFormat. RGBA_8888, 1 ) ;
mMediaProjection. createVirtualDisplay ( "ScreenCapture" ,
dm. widthPixels, dm. heightPixels, dm. densityDpi,
DisplayManager. VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
imageReader. getSurface ( ) , null, null) ;
GBData. reader = imageReader;
}
获取指定坐标的颜色
public class GBData {
private static final String TAG = "GBData" ;
static ImageReader reader;
private static Bitmap bitmap;
public static int getColor ( int x, int y) {
if ( reader == null) {
Log. w ( TAG, "getColor: reader is null" ) ;
return - 1 ;
}
Image image = reader. acquireLatestImage ( ) ;
if ( image == null) {
if ( bitmap == null) {
Log. w ( TAG, "getColor: image is null" ) ;
return - 1 ;
}
return bitmap. getPixel ( x, y) ;
}
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;
if ( bitmap == null) {
bitmap = Bitmap. createBitmap ( width + rowPadding / pixelStride, height, Bitmap. Config. ARGB_8888) ;
}
bitmap. copyPixelsFromBuffer ( buffer) ;
image. close ( ) ;
return bitmap. getPixel ( x, y) ;
}
}
在代码中使用
int color = GBData. getColor ( x, y)
参考