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; 
}

猜你喜欢

转载自blog.csdn.net/qq_40405527/article/details/130272543
今日推荐