android 无须root截图方案的实现

通过反射了截取屏

public class EncoderFeeder {
   public static Bitmap screenshot() {
      String surfaceClassName;
      if (VERSION.SDK_INT <= 17) {
        surfaceClassName = "android.view.Surface";

      } else {
        surfaceClassName = "android.view.SurfaceControl";
      }
      Class<?> classname;
      Bitmap bm = null;
      try {
        classname = Class.forName(surfaceClassName);
        Method method = classname.getDeclaredMethod("screenshot",
              new Class[] { int.class, int.class });
        bm = (Bitmap) method.invoke(
              null,
              new Object[] { Integer.valueOf(Device.x),//分辨率
                   Integer.valueOf(Device.y) });
      } catch (Exception e) {
        e.printStackTrace();
      }

      return bm;
   }

}

这是我们反射调用SurfaceControl.screenshot()和Surface.screenshot(),他们都是系统提供的截屏方法,可是这个方法被@hide的了,无法调用,我们可是使用反射的方式调用,可是我们普通用户通过代码反射调用,方法会返回null,原因是SurfaceControl这个类也被Google隐藏了, 我们知道通adb shell 命令可以调用screencap或者screenshot来截屏adb shell具有截屏截屏的权限也就是说adb shell能够调用到Surface和SurfaceControl这个两个类。 怎么通过adb shell来调用到这两个类呢,这里的主角是app_process,app_process可以直接运行一个普通的Java类。 小结一下:

1.通过adb shell 命令来启动一个app_process程序

export CLASSPATH=/data/app/com.test.syscreen-1.apk",
"exec app_process /system/bin com.test.syscreen.Main '@@'

2.使用app_process程序来启动一个Java程序,在Java程序中可访问到Surface和SurfaceControl这两个类,就可以绕过Root,反射截屏。 更进一步的分析,为什么app_precess程序会有普通用户访问不到的东西呢,查了一下(app_process其实就是Zygote进程,Zygote是由app_process“改名”而来),android中应用程序的进程都是由Zygote进程孵化而来的,Zygote进程启动时会创建一个Dalvik虚机实例,每当有新的应用用进程产生,Zygote会将虚拟机实例复制到它里面,并且Zygote启动时会将Java运行库加载进来,所以一个新的应用有Zygote创建出来,不仅拥有从Zygote拷贝来的虚拟机,还会和Zygote共享Java运行库。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android中SoundPool的使用步骤实例

    大家知道MediaPlayer占用的资源比较多,且不可以同时支持播放多个音频,所以我们有一种叫做SoundPool,比如我们常见的按键音或者是手机提示音,还比如我们在游戏的开发中会有大量的音效效果等,下边介绍一下她的用法: 步骤如下: 1.创建SoundPool对象 源码如下 /** *SoundPool源码中的构造方法方法体 * @param maxStreams 最多可以容纳多少个音频 * @param streamType 指定的声音类型,通过AudioManager类提供的常量进行指定

  • Android中BroadcastReceiver案例讲解

    前言 我们在注册一款App的时候,如果注册成功的话,那么我们就直接跳过登陆界面,直接进入主界面,那么我们现在就通过BroadcastReceiver来实现这个功能: (1)注册界面RegisterActivity.java,这里跳过了一些基本的操作,直接调用的是注册方法signUp()方法: btn_reg.signUp(RegisterActivity.this, new SaveListener() { @Override public void onSuccess() { progress

  • Android实现合并生成分享图片功能

    有时候分享功能都是很需要分享一个当前屏幕的界面的截图因,以前做校内APP的时候用到过,拿出来分享分享, 用以前写过的自定义课表软件. Android 自定义View课程表表格 看到的是图片只显示到11节处,下面的没有显示到 所以用到的 ScrollView 因此截图节截取ScrollView View的图片 一.首先计算出整个ScrollView 的高度宽度生成对应大小的的Bitmap 然后把使用Canvas 将ScrollView 的界面绘制上去 // 获取ScrollView 实际高度 h

  • Android Studio三方引用报错但是项目可以运行的解决方案

    Android Studio第一次启动的Fetching android sdk component information的问题 1)进入刚安装的Android Studio目录下的bin目录.找到idea.properties文件,用文本编辑器打开. 2)在idea.properties文件末尾添加一行: disable.android.first.run=true ,然后保存文件. 3)关闭Android Studio后重新启动,便可进入界面. Android Studio 三方引用报错

  • Android判断json格式将错误信息提交给服务器

    开发中发现, 服务器偶尔会发送错误格式 json 给 Android 客户端, 导致 Android 客户端 json解析失败, 应用异常. 并非服务器有意坑客户端, 而是客户端请求服务器数据时, 除了得到正确 json 数据外, 数据可能还夹杂其它数据. 例如:  thinkPHP 开启  'SHOW_PAGE_TRACE '=> true 时, 正确的 json 后面会夹杂HTML代码, 解决办法: 1. 将 'SHOW_PAGE_TRACE ' =>false   , 设置为false.

  • Android自定义View实现课程表表格

    自己闲下来时间写的一个课表控件,使用的自定义LinearLayout,里面View都是用代码实现的,最终效果如下图,写的可能有问题希望多多指点 创建一个自定义LinearLayout 控件用来装载课程的信息和课程的周数,和节数大概的布局三这样的 根据上面的看来觉得总体布局我分了两个 上面的星期是一个 下面的节数和格子是一个  总体使用Vertical  而单独内部者使用了Horizontal布局  中间使用了两种布局线条 是这样的 /** * 横的分界线 * * @return */ priva

  • 手机方向传感器的缺点及解决方法探究

    方向传感器是算法生成的传感器之一,主要借助于磁场传感器的数据. Android系统自带了方向传感器,不过系统5.0之后方法就被废除了(我们还是可以使用的,只是谷歌不推荐继续使用了).谷歌提供了一套新的算法来作为替代,运用磁场传感器和加速度传感器来计算方向(可自行搜索调用方法). 两种方法之间的优劣暂时无法判定,当然我们希望新方法的效果更好.由于没有具体研究两个算法之间的区别,根据我个人使用经验来说,效果应该差不多. 算法的抗干扰能力很弱 我不是要嘲讽谷歌,而是陈述一个事实.我们想象手机中有一个小

  • Android开发实现ListView点击展开收起效果示例

    本文实例讲述了Android开发实现ListView点击展开收起效果.分享给大家供大家参考,具体如下: 废话不说先上效果: 实际上这是采用一个ExpandableListView实现的 布局文件很简单: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xm

  • Android中Fragment的分屏显示处理横竖屏显示的实现方法

    演示效果如下: 另外在竖屏的时候是这样的效果: 布局文件如下: 可以看出有两个资源文件,一个是处理横屏一个是竖屏 第一个: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent&qu

  • Android实现电子罗盘(指南针)方向传感器的应用

    简介 现在每部Android手机里边都会内置有许多传感器,如光照传感器.加速度传感器.地磁传感器.压力传感器.温度传感器等,它们能够监测到各种发生在手机撒花姑娘的物理事件.当然Android系统只是负责将这些传感器所输出的信息传递给我们,然后我们可以利用这些信息去开发一些好玩的应用. 图片神马的在网上搜个指南针图片就好了,方便学习 main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo

随机推荐