该系列文章总目录链接与各部分简介: 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;
}