Android Qcom Display学习(十五)

该系列文章总目录链接与各部分简介: Android Qcom Display学习(零)

简单方法

按键截图实现原理,通过PhoneWindowManager.java -> DisplayPolicy.java -> ScreenshotHelper.java,这个网上的叙述很多就不展开了

adb shell input keyevent KEYCODE_SYSRQ

/frameworks/base/cmds/screencap/screencap.cpp 这个其实我们之前Layers专题提到的,调用GPU来进行全部图像的合成

adb shell
screencap /sdcard/screen.png

具体实现

frameworks/base/core/java/com/android/internal/util/ScreenshotHelper.java
frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java
一个最最简单的demo, 在一个system apk中调用这个方法,仅仅是尝试学习,framework新手
其实就是bindService TakeScreenshotService后建立连接onServiceConnected,再通过send(msg)发送给TakeScreenshotService去触发screenshot截屏的功能以及截屏后的动画,注意message 传参的时候需要要带上msg.obj,因为TakeScreenshotService中再handlemessage的时候会调用ScreenshotHelper.ScreenshotRequest中的getTopComponent(), 如果没有传参的话就是一个空指针直接报错了

import com.android.internal.util.ScreenshotHelper;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.os.Looper;
import android.os.Handler;
import android.os.UserHandle;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.ComponentName;

private void takeScreenshot(){
    ComponentName cn = new ComponentName("com.android.systemui",
            "com.android.systemui.screenshot.TakeScreenshotService");
    Intent intent = new Intent();
    intent.setComponent(cn);
    Log.e(TAG, "jerry triggger takeScreenshot");
    ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name,
                                       IBinder service) {
                if (mScreenshotConnection != this) {
                    return;
                }

                Messenger messenger = new Messenger(service);
                int TAKE_SCREENSHOT_FULLSCREEN = 1;
                int mScreenshotType = TAKE_SCREENSHOT_FULLSCREEN;

                Message msg = Message.obtain(null, mScreenshotType);

                int SCREENSHOT_OTHER = 5;
                boolean hasStatus = true;
                boolean hasNav = true;

                //ScreenshotHelper.ScreenshotRequest screenrequest  = new ScreenshotHelper.ScreenshotRequest(
                //					SCREENSHOT_OTHER, hasStatus, hasNav);
                ScreenshotHelper screen = new ScreenshotHelper(mContext);
                ScreenshotHelper.ScreenshotRequest screenrequest = screen.newobject();


                final ServiceConnection myConn = this;
                Handler h = new Handler(Looper.getMainLooper()) {
                    @Override
                    public void handleMessage(Message msg) {

                    }
                };
                msg.obj = screenrequest;
                msg.replyTo = new Messenger(h);
                msg.arg1 = msg.arg2 = 0;

                try {
                    messenger.send(msg);
                } catch (RemoteException e) {
               }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
                if (mScreenshotConnection != null) {
                    unbindService(mScreenshotConnection);
                    mScreenshotConnection = null;
                }

        }
    };
    bindServiceAsUser(intent, conn, BIND_AUTO_CREATE | BIND_FOREGROUND_SERVICE,
                              UserHandle.CURRENT);
    mScreenshotConnection = conn;

}  

调内部静态类一直报错no construct,找不到原因,error: no suitable constructor found for ScreenshotRequest(int,boolean,boolean)
ScreenshotHelper.ScreenshotRequest screenrequest = new ScreenshotHelper.ScreenshotRequest(SCREENSHOT_OTHER, hasStatus, hasNav);于是除此下次写一个接口将new的对象return回来,

frameworks/base/core/java/com/android/internal/util/ScreenshotHelper.java

public ScreenshotRequest newobject(){
    ScreenshotRequest screenshot = new ScreenshotRequest(SCREENSHOT_OTHER, true, true);
	return screenshot; 
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值