`
bogongjie
  • 浏览: 236041 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

android 截屏的三种方法

阅读更多

1. 采用API做法,这种做法的好处是不需要特殊的权限处理。不过在一种情况下不能用,就是在打开camera的情况下使用这种方法:

 

private static Bitmap takeScreenShot(Activity activity) {
		// View是你需要截图的View
		View view = activity.getWindow().getDecorView();
		view.setDrawingCacheEnabled(true);
		view.buildDrawingCache();
		Bitmap b1 = null;
		try {
			b1 = view.getDrawingCache();
		} catch (OutOfMemoryError e) {
			// TODO: handle exception
		}

		// 获取状态栏高度
		Rect frame = new Rect();
		activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
		int statusBarHeight = frame.top;
		System.out.println(statusBarHeight);
		// 获取屏幕长和高
		int width = activity.getWindowManager().getDefaultDisplay().getWidth();
		int height = activity.getWindowManager().getDefaultDisplay().getHeight();
		// 去掉标题栏
		// Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
		Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight);
		view.destroyDrawingCache();
		return b;
	}

 

2.采用Surface的隐藏方法,不过这种方法需要的源码中重新build.

 

void takeScreenshot() {
		// We need to orient the screenshot correctly (and the Surface api seems to take screenshots
		// only in the natural orientation of the device :!)
		mDisplay.getRealMetrics(mDisplayMetrics);
		float[] dims = { mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels };
		float degrees = getDegreesForRotation(mDisplay.getRotation());
		boolean requiresRotation = (degrees > 0);
		if (requiresRotation) {
			// Get the dimensions of the device in its native orientation
			mDisplayMatrix.reset();
			mDisplayMatrix.preRotate(-degrees);
			mDisplayMatrix.mapPoints(dims);
			dims[0] = Math.abs(dims[0]);
			dims[1] = Math.abs(dims[1]);
		}

		// Take the screenshot
		mScreenBitmap = Surface.screenshot((int) dims[0], (int) dims[1]);
		// mScreenBitmap = android.view.SurfaceControl.screenshot((int) dims[0], (int) dims[1]);
		if (mScreenBitmap == null) {
			// notifyScreenshotError(mContext, mNotificationManager);
			// finisher.run();
			Log.i("W", "mScreenBitmap null");
			return;
		}

		if (requiresRotation) {
			// Rotate the screenshot to the current orientation
			Bitmap ss = Bitmap.createBitmap(mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels, Bitmap.Config.ARGB_8888);
			Canvas c = new Canvas(ss);
			c.translate(ss.getWidth() / 2, ss.getHeight() / 2);
			c.rotate(degrees);
			c.translate(-dims[0] / 2, -dims[1] / 2);
			c.drawBitmap(mScreenBitmap, 0, 0, null);
			c.setBitmap(null);
			// Recycle the previous bitmap
			mScreenBitmap.recycle();
			mScreenBitmap = ss;
		}

		// Optimizations
		mScreenBitmap.setHasAlpha(false);
		mScreenBitmap.prepareToDraw();

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SS");
		String name = sdf.format(new Date()) + ".jpg";
		savePic(mScreenBitmap, name);

		// Start the post-screenshot animation
		// startAnimation(finisher, mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels, statusBarVisible, navBarVisible);
	}

 

3.采用命令的方式,这种方式的4.0之后都可以(包括4.0),如果要在程序中实现,需要系统权限。

    

screencap /mnt/sdcard/screen.png

      4.0之后也提供screenrecord录制屏幕的方法:

   

screenrecord --h                                     
Usage: screenrecord [options] <filename>

Records the device's display to a .mp4 file.

Options:
--size WIDTHxHEIGHT
    Set the video size, e.g. "1280x720".  Default is the device's main
    display resolution (if supported), 1280x720 if not.  For best results,
    use a size supported by the AVC encoder.
--bit-rate RATE
    Set the video bit rate, in megabits per second.  Default 4Mbps.
--time-limit TIME
    Set the maximum recording time, in seconds.  Default / maximum is 180.
--rotate
    Rotate the output 90 degrees.
--verbose
    Display interesting information on stdout.
--help
    Show this message.

Recording continues until Ctrl-C is hit or the time limit is reached.

 

 

 

分享到:
评论

相关推荐

    Android截屏截图的几种方法总结

    Android截屏截图的几种方法总结 Android截屏截图是 Android 开发中常见的需求, Android 截屏截图方法汇总将为您带来多种截屏截图方法的总结,让您更好地掌握 Android 截屏截图技术。在本文中,我们将探讨 ...

    Android中SurfaceView截屏

    本文将详细介绍如何在Android中实现`SurfaceView`的截屏功能。 首先,了解`SurfaceView`的基本原理。`SurfaceView`创建了一个独立的窗口,并在自己的Surface上绘制内容。这使得它可以在后台线程进行高效的绘制,但...

    android截图,android截屏,adb截屏,

    是android轻量级的截屏工具非常的好用 1.把脚本放入指定目录下面: C:\Users\****\AppData\Local\Android\Sdk\platform-tools 2.把用手机打开想要截图的页面双击运行此脚本,图片就截取到脚本所在的文件夹

    Android 截屏并且合成截屏图片

    - **API调用**:Android提供了多种截屏方式,其中一种是通过Java代码调用`WindowManager`的`getDefaultDisplay()`方法获取屏幕尺寸,然后使用`View`的`draw()`方法将屏幕内容绘制到`Bitmap`对象上。此外,还可以...

    ScreenShotSample_android截屏_DEMO_android截屏demo_

    `ScreenShotSample_android截屏_DEMO_android截屏demo` 提供了一个Android客户端实现截屏服务的示例项目,帮助开发者了解如何在应用程序中集成截屏功能。下面将详细阐述这个DEMO涉及的核心知识点及其实现方法。 1. ...

    Android截屏示例demo

    本示例“Android截屏示例demo”旨在教你如何通过执行ADB(Android Debug Bridge)shell命令来实现这一功能。ADB是Android开发者的重要工具,它允许你通过命令行与连接的Android设备进行交互,包括安装应用、调试、...

    android截屏(root)

    在Android操作系统中,"android截屏(root)"是指通过获取设备的root权限来实现更高级别的屏幕截图功能。root是Android系统中的一个概念,它允许用户获取到系统的最高权限,能够访问和修改系统级别的文件,包括那些...

    VLC-Android 截图录像功能

    总结,VLC-Android 2.16版本在截图和录像方面提供了全面的支持,无论是在32位还是64位的Android设备上都能流畅运行。这些功能的实现依赖于VLC强大的多媒体处理技术,以及对Android平台的深入理解和优化。VLCTEST则为...

    android后台服务悬浮窗动态截屏

    要实现在Android中截屏,你需要调用`ActivityManager.RunningAppProcessInfo.isForeground()`方法来判断当前应用是否处于前台,如果在后台,则启动IntentService。在Service中,你可以使用`WindowManager`接口添加一...

    Android截屏(可截取不可见的部分)

    Bitmap是Android图形库中的一种图像数据结构,用于存储像素信息。要将一个View转换为Bitmap,我们可以使用`View.draw(Canvas)`方法,这个方法会将View的内容绘制到指定的Canvas上。然后,我们可以通过`Bitmap.create...

    Android 截屏 和录制屏幕

    在Android平台上,截屏和录制屏幕是两种常见的功能,它们对于开发者调试应用、用户分享屏幕内容或制作教程视频都有重要作用。接下来,我们将深入探讨这两种技术的实现原理。 **一、Android 截屏** 1. **获取屏幕...

    android截屏保存为图片

    以下是对"android截屏保存为图片"这个主题的详细说明。 **一、Android系统中的截屏原理** 在Android系统中,截屏操作通常涉及到两个关键组件:SurfaceFlinger服务和WindowManager服务。SurfaceFlinger是负责将应用...

    android VLC可实现rtsp播放 录屏 截图等功能

    Android系统自API 21(Lollipop)开始提供了录屏API,但对第三方应用有诸多限制。VLC SDK提供了一种替代方法,通过其内建的屏幕捕获和编码能力实现录屏。 - 获取屏幕尺寸和密度,设置编码参数。 - 初始化VLC SDK...

    android截屏实现demo

    在Android平台上,实现截屏功能...总之,Android截屏功能的实现主要涉及对View的操作,包括获取根View、强制绘制、转换为Bitmap以及保存为文件等步骤。了解这些知识点,可以帮助开发者在自己的应用中轻松添加截屏功能。

    android jni 屏幕截图 NativeScreenCapture

    本项目“android jni 屏幕截图 NativeScreenCapture”专注于利用JNI技术来实现Android设备的屏幕截图功能。下面将详细介绍这个过程涉及的关键知识点。 1. **JNI基础**:JNI是Android平台上的一个接口,它为Java应用...

    Android截屏以及解析截屏程序源代码

    在Android系统中,截屏是用户日常操作的一部分,主要用于记录屏幕内容或分享给他人。而无需root权限的截图方式更是受到广泛欢迎,因为root设备可能会带来安全风险。本主题主要探讨如何通过C++来实现这一功能,并解析...

    Android 2.3截屏JNI代码

    Android 2.3中的截屏功能可以通过JNI(Java Native Interface)来实现,这是一种在Java程序中调用本地(C/C++)代码的技术。JNI允许开发者利用Java的跨平台特性,同时利用C/C++的强大性能和低级别操作能力。在这个场景下...

    Android MediaProjection截屏&amp;录屏-适配Android

    Android MediaProjection截屏&录屏 1、解决Android Q中java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION 异常 2、...

    Android 基于4.4系统截屏的三指截屏

    实现android三指截屏功能

Global site tag (gtag.js) - Google Analytics