用到的API

  • MediaProjectionManager
  • MediaProjection
  • VirtualDisplay
  • ImageReader

原理:利用Android系统提供的投影功能把屏幕投影到ImageReader中,通过ImageReader获取到Bitmap,调用BitmapgetPixel(x, y)方法获取到指定坐标的颜色。

代码

创建虚拟显示器

    private static final int REQUEST_MEDIA_PROJECTION = 1;private MediaProjectionManager mMediaProjectionManager;private MediaProjection mMediaProjection;private VirtualDisplay mVirtualDisplay;   @Overrideprotected 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);}@Overridepublic 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)

参考

  • https://github.com/googlesamples/android-ScreenCapture/#readme
  • https://developer.android.com/reference/android/media/ImageReader.html#getSurface()
  • https://www.jianshu.com/p/d7eb518195fd

Android 获取屏幕指定坐标的颜色相关推荐

  1. Android 获取屏幕指定坐标的颜色——“按键精灵”基础

    原理:借助Android系统提供的ImageReader读取当前屏幕,然后转化为Bitmap对象,Bitmap像素宽高正好和当前屏幕一致,然后调用Bitmap中的getPixel(x, y)方法获取目 ...

  2. c语言 获取 屏幕 像素坐标和颜色,在屏幕上获取颜色和绝对坐标,方便地选择像素...

    问题 我寻找一个工具,可以让我选择屏幕上的像素,并获得RGB颜色和绝对(x,y)的位置. ubuntu有没有什么类似的东西? 答案1 最合适的是,一个Windows的小工具ColorPix (通过wi ...

  3. python 获取屏幕颜色_Python3 获取手机屏幕指定坐标点的 RGBA 和 16 进制颜色

    # -*- coding: utf-8 -*- # @file: test.py # @author: xiaoxiao # @date : 2019/8/14 from PIL import Ima ...

  4. android 获取屏幕的宽高

    今天,讲讲android如何获取屏幕的宽高. // 通过WindowManager获取 DisplayMetrics dm = new DisplayMetrics(); getWindowManag ...

  5. android获取键盘状态,Android获取屏幕方向及键盘状态的小例子

    Android获取屏幕方向及键盘状态的小例子 复制代码 代码如下: Configuration config = getResources().getConfiguration(); if (conf ...

  6. android获取屏幕像素密度DPI、density、屏幕宽高

    获取手机屏幕像素密度 dpi DisplayMetrics metrics = new DisplayMetrics(); getActivity().getWindowManager().getDe ...

  7. Android 获取屏幕尺寸与密度

    遇到一个问题,我的地图浮标图片在WVGA手机上正好,在QVGA上就显的太大,所以我要根据屏幕的不同调整浮标的大小使其在QVGA大小合适.有的同事提出了依据分辨率来区分不同的屏幕,但是单WVGA就支持好 ...

  8. android获取导航栏宽高,Android获取屏幕的宽高度、状态栏、标题栏、导航栏、编辑区域高度...

    目录 0.相关文章: 1.获取屏幕款高度 代码: /** * 获取屏幕宽度 * * @param context 上下文对象 * @return int */ public static int ge ...

  9. Android 获取屏幕尺寸(设备对角线的英寸数)

    使用屏幕的实际的宽高,根据勾股定理来计算设备的尺寸. 由于Android系统版本的不同和有的设备具有虚拟按键,需要根据不同的SDK的版本使用不同的方法来获取屏幕的实际宽高. 计算方法: Math.sq ...

最新文章

  1. ICLR 2020 | 如何解决图像分类中的类别不均衡问题?不妨试试分开学习表征和分类器...
  2. ES学习笔记之-AvgAggregation的实现过程分析
  3. Android Full-Disk Encryption
  4. python零基础系统学习教程之Python 变量类型
  5. MongoDB在linux下的启动
  6. P2805 [NOI2009]植物大战僵尸
  7. 虎牙tv是用php写的吗,huya虎牙php_麦麦同学
  8. 汇川技术小型PLC梯形图编程系列教程(1)小型PLC型号H123U简介
  9. 谷歌查排名php,谷歌排名检查:PHP函数来获得googlerank关键词 | LsevenTT博客-站群哥...
  10. 秋天的第一杯奶茶刷屏互联网,其背后又蕴含着哪些营销逻辑呢?
  11. Maven Helper 插件介绍
  12. Windows基础 加固
  13. 4PCS、super4PCS粗配准算法理解
  14. JIRA实践系列-JIRA与teambition对接指南
  15. 【GANs学习笔记】(十八)LAPGAN、ProGAN、SRGAN
  16. android 红包功能,[原创]实现某app的抢红包功能
  17. ASP.NET常见命名空间及其功能描述
  18. 一起学Netty(六)之 TCP粘包拆包场景
  19. 导出浏览器cookie
  20. 字符串替换c语言you替代we,字符串替换_无以伦比的暖阳的技术博客_51CTO博客

热门文章

  1. Matlab 学习网站总结
  2. 足球经理 2018 for Mac(体育类模拟经营游戏)
  3. myeclipse的An internal error occurred during: “Initialize Control Control“错误!!!
  4. 知识源于生活而高于生活
  5. 【区块链技术工坊47期】众享比特:区块链医疗方案和分布式认证系统
  6. 行为层(JavaScript)
  7. ThinkPad E440 Ubuntu 无线驱动总是掉线的问题
  8. 本地配置iis信息服务器,如何配置本地IIS服务器.doc
  9. 正则表达式 分割地址 获取省市区详细地址
  10. selenium自动化之iframe弹窗操作实例