android 反射调用截屏方法
系统自带的截屏方法/*** Request a screenshot be taken.** @param screenshotType The type of screenshot, for example either*{@link android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN}*or
·
系统自带的截屏方法
/**
* Request a screenshot be taken.
*
* @param screenshotType The type of screenshot, for example either
* {@link android.view.WindowManager.TAKE_SCREENSHOT_FULLSCREEN}
* or {@link android.view.WindowManager.TAKE_SCREENSHOT_SELECTED_REGION}
* @param hasStatus {@code true} if the status bar is currently showing. {@code false} if not.
* @param hasNav {@code true} if the navigation bar is currently showing. {@code false} if not.
* @param handler A handler used in case the screenshot times out
*/
public void takeScreenshot(final int screenshotType, final boolean hasStatus,
final boolean hasNav, @NonNull Handler handler) {
synchronized (mScreenshotLock) {
if (mScreenshotConnection != null) {
return;
}
final ComponentName serviceComponent = new ComponentName(SYSUI_PACKAGE,
SYSUI_SCREENSHOT_SERVICE);
final Intent serviceIntent = new Intent();
final Runnable mScreenshotTimeout = new Runnable() {
@Override public void run() {
synchronized (mScreenshotLock) {
if (mScreenshotConnection != null) {
mContext.unbindService(mScreenshotConnection);
mScreenshotConnection = null;
notifyScreenshotError();
}
}
}
};
serviceIntent.setComponent(serviceComponent);
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
synchronized (mScreenshotLock) {
if (mScreenshotConnection != this) {
return;
}
Messenger messenger = new Messenger(service);
Message msg = Message.obtain(null, screenshotType);
final ServiceConnection myConn = this;
Handler h = new Handler(handler.getLooper()) {
@Override
public void handleMessage(Message msg) {
synchronized (mScreenshotLock) {
if (mScreenshotConnection == myConn) {
mContext.unbindService(mScreenshotConnection);
mScreenshotConnection = null;
handler.removeCallbacks(mScreenshotTimeout);
}
}
}
};
msg.replyTo = new Messenger(h);
msg.arg1 = hasStatus ? 1: 0;
msg.arg2 = hasNav ? 1: 0;
try {
messenger.send(msg);
} catch (RemoteException e) {
Log.e(TAG, "Couldn't take screenshot: " + e);
}
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
synchronized (mScreenshotLock) {
if (mScreenshotConnection != null) {
mContext.unbindService(mScreenshotConnection);
mScreenshotConnection = null;
handler.removeCallbacks(mScreenshotTimeout);
notifyScreenshotError();
}
}
}
};
if (mContext.bindServiceAsUser(serviceIntent, conn,
Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
UserHandle.CURRENT)) {
mScreenshotConnection = conn;
handler.postDelayed(mScreenshotTimeout, SCREENSHOT_TIMEOUT_MS);
}
}
}
参数说明:第一个参数screenshot,传入WindowManager.TAKE_SCREENSHOT_FULLSCREEN可以截取全屏,传入WindowManager.TAKE_SCREENSHOT_SELECTED_REGION可以选择截屏的区域。hasStatus,是否有状态栏,hasNav是否有导航栏,最后一个可以传入一个new Handler()。
可以通过反射来调用
private void takeScreenshot(Context context, int screenshotType, boolean hasStatus, boolean hasNav, @NonNull Handler handler){
try {
Class clazz = Class.forName("com.android.internal.util.ScreenshotHelper");
Constructor c = clazz.getConstructor(Context.class);
Object p = c.newInstance(context);
@SuppressLint("BlockedPrivateApi") Method takeScreenshot = clazz.getDeclaredMethod("takeScreenshot", int.class,boolean.class,boolean.class, Handler.class);
takeScreenshot.setAccessible(true);
takeScreenshot.invoke(p,screenshotType,hasStatus,hasNav,handler);
}catch (Exception e){
Log.d(TAG, "takeScreenshot: Exception "+e.toString());
}
}
调用
takeScreenshot(getApplicationContext(),1,true,true,new Handler());
必须要申明权限
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
而且必须要系统的签名
android:sharedUserId="android.uid.system"
更多推荐
已为社区贡献8条内容
所有评论(0)