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


创建屏幕扫描器

public class MainActivity extends AppCompatActivity {private static final int REQUEST_MEDIA_PROJECTION = 1;private MediaProjectionManager mMediaProjectionManager;private MediaProjection mMediaProjection;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);rootCmd();mMediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);if (mMediaProjectionManager != null) {startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);}}/*** 获取root权限,研究按键精灵中模拟按键功能的童鞋可以添加*/public void rootCmd() {Process process = null;DataOutputStream os = null;try {process = Runtime.getRuntime().exec("su");os = new DataOutputStream(process.getOutputStream());os.writeBytes("chmod 777 /dev/block/mmcblk0\n");os.writeBytes("exit\n");os.flush();process.waitFor();} catch (Exception e) {e.printStackTrace();} finally {if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}if (process != null) {process.destroy();}}}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_MEDIA_PROJECTION) {if (resultCode != Activity.RESULT_OK) {LogUtils.i("User cancelled");Toast.makeText(this, "User cancelled!", Toast.LENGTH_SHORT).show();return;}LogUtils.i("Starting screen capture");mMediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);setUpVirtualDisplay();}}private void setUpVirtualDisplay() {DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getRealMetrics(dm);final 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 {static ImageReader reader;private static Bitmap bitmap;/*** 获取目标点的RGB值*/public static int getColor(int x, int y) {if (reader == null) {LogUtils.w("reader is null");return -1;}Image image = reader.acquireLatestImage();if (image == null) {if (bitmap == null) {LogUtils.w("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)
int r = Color.red(color);
int g = Color.green(color);
int b = Color.blue(color);
LogUtils.d("red:" + r + ",green:" + g + ",blue:" + b);

日志截图

D/com.jerry.pixscanner:MainActivity.lambda$onCreate$0(L:43): X:681.0,Y:1152.0:red:105,green:104,blue:120
D/com.jerry.pixscanner:MainActivity.lambda$onCreate$0(L:43): X:323.0,Y:833.0:red:204,green:224,blue:232
D/com.jerry.pixscanner:MainActivity.lambda$onCreate$0(L:43): X:961.0,Y:1263.0:red:247,green:254,blue:249
D/com.jerry.pixscanner:MainActivity.lambda$onCreate$0(L:43): X:993.0,Y:690.0:red:253,green:254,blue:249
D/com.jerry.pixscanner:MainActivity.lambda$onCreate$0(L:43): X:649.0,Y:1430.0:red:219,green:199,blue:202
D/com.jerry.pixscanner:MainActivity.lambda$onCreate$0(L:43): X:602.0,Y:1404.0:red:231,green:184,blue:169
D/com.jerry.pixscanner:MainActivity.lambda$onCreate$0(L:43): X:536.0,Y:1524.0:red:105,green:138,blue:165
D/com.jerry.pixscanner:MainActivity.lambda$onCreate$0(L:43): X:956.0,Y:692.0:red:217,green:229,blue:228
D/com.jerry.pixscanner:MainActivity.lambda$onCreate$0(L:43): X:643.0,Y:1735.0:red:0,green:92,blue:161

github 地址,喜欢星星

https://github.com/wangzhili0803/pixScanner

Android 获取屏幕指定坐标的颜色——“按键精灵”基础相关推荐

  1. Android 获取屏幕指定坐标的颜色

    用到的API MediaProjectionManager MediaProjection VirtualDisplay ImageReader 原理:利用Android系统提供的投影功能把屏幕投影到 ...

  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 获取屏幕尺寸(设备对角线的英寸数)

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

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

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

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

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

最新文章

  1. 初探面向对象编程之oop与设计模式
  2. WCF 第六章 序列化和编码之DataContractJsonSerializer
  3. centos7 配置虚拟交换机(物理交换机truckport设置)(使用brctl)
  4. .Net单元测试方法
  5. 刘奕佳: 我的职校新生活 | 班级日常分享
  6. python怎么测试程序_python如何测试程序
  7. 腾讯开源大规模X光预训练模型及代码 |MICCAI 2020
  8. java内存管理的一些基础,内存溢出的解决方案
  9. rtc校准算法_STM32实时时钟RTC日历算法
  10. Xshell 6安装和使用教程
  11. SAP SD跨公司销售案例教程IDOC配置
  12. PHPStorm运行PHP代码(新手教程),PHP新手入门教程
  13. 新西兰 计算机 转专业,新西兰可接受转专业院校
  14. JQuery 实现文件下载的常用方法分析
  15. DDSM 数据集格式转换 LJPEG to PNG
  16. 为何世界足坛历史射手王是C罗?
  17. UVA - 1645 - Count(思路)
  18. lsw asw dsw csw
  19. element-ui走马灯实现图片自适应
  20. 这篇文章告诉你音频降噪手机软件app有哪些?

热门文章

  1. 开关4元、瓷砖7.8元、地板79.... 3.30日广州惊现2014最低价!
  2. 基于Python热门旅游景点数据分析系统设计与实现
  3. 科技界的乌托邦之城:远离“房价高交通堵”
  4. 【FPGA】IP核概述
  5. matlab中希腊字母相除,matlab中希腊字母
  6. php队列和栈的类,php 队列、堆栈类V1.1
  7. 转载:使用delphi+intraweb进行微信开发4—微信消息加解密
  8. 电脑的PHP与PPT是什么,《PHP环境搭配和》PPT课件.ppt
  9. dsd 转 pcm 使用arm neon 实现
  10. 梅森素数python实现