-
2022-02-16 15:46:36
一、用法
screencap [-hp] [-d 显示id] [文件名]
二、参数
-h: 查看帮助信息
-p: 保存文件为png格式
-d: 指定截取的显示id,默认为fb0(fb为framebuffer)三、说明
如果文件名以.png结束,将保存为png格式文件
如果没有文件名,将直接打印到标准输出四、举例
1|stvs9:/sdcard # screencap jietu.png 130|stvs9:/sdcard # ls -l total 13 drwxrwxrwx 2 root sdcard_rw 4096 2020-09-04 11:24 Alarms drwxrwxrwx 4 root sdcard_rw 4096 2020-04-27 10:02 Android drwxrwxrwx 2 root sdcard_rw 4096 2020-09-04 11:24 DCIM drwxrwxrwx 2 root sdcard_rw 4096 2020-09-04 11:24 Download drwxrwxrwx 2 root sdcard_rw 4096 2020-09-04 11:24 Movies drwxrwxrwx 2 root sdcard_rw 4096 2020-09-04 11:24 Music drwxrwxrwx 2 root sdcard_rw 4096 2020-09-04 11:24 Notifications drwxrwxrwx 2 root sdcard_rw 4096 2020-09-04 11:24 Pictures drwxrwxrwx 2 root sdcard_rw 4096 2020-09-04 11:24 Podcasts drwxrwxrwx 2 root sdcard_rw 4096 2020-09-04 11:24 Ringtones drwxrwxrwx 2 root sdcard_rw 4096 2020-04-27 13:54 debug_logs -rw-rw-rw- 1 root sdcard_rw 0 2020-05-15 16:04 fb0.png -rw-rw-rw- 1 root sdcard_rw 0 2020-05-15 16:04 jietu.png
更多相关内容 -
android截图,android截屏,adb截屏,
2019-03-01 15:19:47是android轻量级的截屏工具非常的好用 1.把脚本放入指定目录下面: C:\Users\****\AppData\Local\Android\Sdk\platform-tools 2.把用手机打开想要截图的页面双击运行此脚本,图片就截取到脚本所在的文件夹 -
Android截屏截图的几种方法总结
2020-08-30 16:09:04主要介绍了 Android截屏截图方法汇总(Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)的相关资料,需要的朋友可以参考下 -
安卓截图截屏相关-Android截屏APP工具.zip
2019-07-29 16:25:01Android 截屏 APP 工具.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。 -
安卓截图截屏相关-android截屏上传图片到服务器.rar
2019-07-29 16:25:09android截屏上传图片到服务器.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。 -
Android截屏SurfaceView黑屏问题的解决办法
2020-08-30 10:50:41主要为大家详细介绍了Android截屏SurfaceView黑屏问题的解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
详解Android截屏事件监听
2021-01-20 10:22:21Android系统没有直接对截屏事件监听的接口,也没有广播,只能自己动手来丰衣足食,一般有三种方法。 利用FileObserver监听某个目录中资源变化情况 利用ContentObserver监听全部资源的变化 监听截屏快捷按键 由于... -
android实现手机截屏并保存截图功能
2020-08-26 21:18:37主要为大家详细介绍了android实现手机截屏并保存截图功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
Android截屏分享功能
2021-05-28 02:09:56Android截屏分享功能发布时间:2020-08-23 03:48:10来源:脚本之家阅读:81作者:奔跑的佩恩最近项目需要实现Android截屏分享功能,包括Android截屏获取图片、将图片保存到本地、通知系统相册更新、通过微信、QQ、...Android截屏分享功能
发布时间:2020-08-23 03:48:10
来源:脚本之家
阅读:81
作者:奔跑的佩恩
最近项目需要实现Android截屏分享功能,包括Android截屏获取图片、将图片保存到本地、通知系统相册更新、通过微信、QQ、微博分享截屏图片,本篇文章作为总结回顾。
一、Android截屏获取图片
通过对view进行绘制,得到bitmap,可以对Activity、Fragment进行绘制,也可以对其他的View进行绘制。
1 Activity截图(带空白的状态栏)
public Bitmap shotScreen(Activity activity) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.setDrawingCacheEnabled(false);
view.destroyDrawingCache();
return bitmap;
}
2 Activity截图(去掉状态栏)
public Bitmap shotActivityNoBar(Activity activity) {
// 获取windows中最顶层的view
View view = activity.getWindow().getDecorView();
view.buildDrawingCache();
// 获取状态栏高度
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int statusBarHeights = rect.top;
Display display = activity.getWindowManager().getDefaultDisplay();
// 获取屏幕宽和高
int widths = display.getWidth();
int heights = display.getHeight();
// 允许当前窗口保存缓存信息
view.setDrawingCacheEnabled(true);
// 去掉状态栏
Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0,
statusBarHeights, widths, heights - statusBarHeights);
// 销毁缓存信息
view.destroyDrawingCache();
return bmp;
}
3 Fragment截图
public Bitmap getFragmentBitmap(Fragment fragment) {
View v = fragment.getView();
v.buildDrawingCache(false);
return v.getDrawingCache();
}
绘制View的方式只适用于静态View,SurfaceView、IjkVideoView等播放视频的View,不能截取到;此外,某些动画类View也不能截取到。针对上述情况,可获取SurfaceView的一帧生成bitmap,将bitmap进行合并,同理动画类View也可以合并。例如,最底层播放视频、中间层播放动画、最上层是普通的view,可将bitmap合并,如下:
public Bitmap combineBitmapInCenter(Bitmap background, Bitmap midBitmap, Bitmap foreground) {
if (!background.isMutable()) {
background = background.copy(Bitmap.Config.ARGB_8888, true);
}
Paint paint = new Paint();
Canvas canvas = new Canvas(background);
int bw = background.getWidth();
int bh = background.getHeight();
int mw = midBitmap.getWidth();
int mh = midBitmap.getHeight();
int mx = (mw - bw) / 2;
int my = (mh - bh) / 2;
canvas.drawBitmap(midBitmap, mx, my, paint);
int fw = foreground.getWidth();
int fh = foreground.getHeight();
int fx = (fw - bw) / 2;
int fy = (fh - bh) / 2;
canvas.drawBitmap(foreground, fx, fy, paint);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return background;
}
需要注意:view的绘制必须在UI线程完成,否则会crash;bitmap的合并会较耗时,需在子线程完成。
二 、将bitmap保存在本地
public void saveBitmapToFile(String fileName, Bitmap bitmap) {
if (TextUtils.isEmpty(fileName) || bitmap == null) return;
try {
File f = new File(fileName);
f.createNewFile();
FileOutputStream fOut = new FileOutputStream(f);
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, fOut);
fOut.flush();
fOut.close();
} catch (FileNotFoundException e) {
Log.i("ScreenShotUtil", "保存失败");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
三、通知系统相册更新
public void AlbumScan(String fileName) {
MediaScannerConnection.scanFile(mActivity.getApplicationContext(), new String[]{fileName}, new String[]{"image/jpeg"}, null);
}
四、通过微信、QQ、微博分享
通过微信、QQ、微博分享的sdk实现,如下:
1 分享到微信朋友圈
public void shareToWexinCircle() {
if (iShareService.isWeixinInstalled()) {//判断微信是否安装
Bitmap mWXShareBitmap = mLatesBitmap;//将截屏得到的bitmap赋值
WXImageObject imgObject = new WXImageObject(mWXShareBitmap);
WXMediaMessage mediaMessage = new WXMediaMessage();
mediaMessage.mediaObject = imgObject;
Log.i(TAG,"mediaMessage.mediaObject = imgObject");
//设置缩略图
Bitmap thumbBmp = Bitmap.createScaledBitmap(mWXShareBitmap,50,80,true);
mediaMessage.thumbData = bmpToByteArray(thumbBmp,true);
Log.i(TAG,"设置缩略图");
//request to wx
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");//分享类型是图片
req.message = mediaMessage;
req.scene = SendMessageToWX.Req.WXSceneTimeline;//分享到朋友圈
Log.i(TAG,"request to wx");
IWXAPI api = WXAPIFactory.createWXAPI(mActivity,"微信分享id",true);
api.registerApp("微信分享id");
boolean result = api.sendReq(req);
Log.i(TAG,"share to circle:"+result);
} else {
ToastUtils.show(mActivity, "您没有安装微信客户端");
}
}
public byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, output);
if (needRecycle) {
bmp.recycle();
}
byte[] result = output.toByteArray();
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
private String buildTransaction(final String type) {
return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
}
2、分享到微信好友
public void shareWexinFriend() {
if (iShareService.isWeixinInstalled()) {
mWXShareBitmap = mLatesBitmap;
WXImageObject imgObject = new WXImageObject(mWXShareBitmap);
WXMediaMessage mediaMessage = new WXMediaMessage();
mediaMessage.mediaObject = imgObject;
//设置缩略图
Bitmap thumbBmp = Bitmap.createScaledBitmap(mWXShareBitmap,50,80,true);
mediaMessage.thumbData = bmpToByteArray(thumbBmp,true);
//request to wx
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction =buildTransaction("img");
req.message = mediaMessage;
req.scene = SendMessageToWX.Req.WXSceneSession;
IWXAPI api = WXAPIFactory.createWXAPI(mActivity,"微信分享id",true);
api.registerApp("微信分享id");
boolean result = api.sendReq(req);
Log.i(TAG,"share to weixin:"+result );
} else {
ToastUtils.show(mActivity, "您没有安装微信客户端");
}
}
3、分享到QQ好友
public void shareToQQFriend() {
if (iShareService.isQQInstalled()) {//判断QQ是否安装
Tencent tencent = Tencent.createInstance("qq id", mActivity);
Bundle params = new Bundle();
params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, mLatestImagePath);//QQ分享只能分享本地图片,传入本地图片路径
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
tencent.shareToQQ(mActivity, params, new IUiListener() {//分享后的回调
@Override
public void onComplete(Object o) {
ToastUtils.show(mActivity,"分享成功!");
}
@Override
public void onError(UiError uiError) {
ToastUtils.show(mActivity,"分享失败,稍后重试!");
Log.i(TAG,"shareToQQ onError");
}
@Override
public void onCancel() {
Log.i(TAG,"shareToQQ onCancel");
}
});
} else {
ToastUtils.show(mActivity, "您没有安装QQ客户端");
}
}
4 QQ空间分享
public void shareToQQZone() {
if (iShareService.isQQInstalled()) {
Tencent tencent = Tencent.createInstance("QQ id", mActivity);
Bundle params = new Bundle();
params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, mLatestImagePath);
params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
tencent.shareToQQ(mActivity, params, new IUiListener() {
@Override
public void onComplete(Object o) {
ToastUtils.show(mActivity,"分享成功!");
}
@Override
public void onError(UiError uiError) {
ToastUtils.show(mActivity,"分享失败,请稍后重试!");
Log.i(TAG,"shareToQQ onError,error code:"+uiError.errorCode);
}
@Override
public void onCancel() {
Log.i(TAG,"shareToQQ onCancel");
}
});
} else {
ToastUtils.show(mActivity, "您没有安装QQ客户端");
}
5 微博分享
public void shareToWeibo() {
if (iShareService.isWeiboInstalled()) {
Log.i(TAG,"iShareService.isWeiboInstalled()");
IWeiboShareAPI api = WeiboShareSDK.createWeiboAPI(mActivity, "微博id");
if(api.isWeiboAppInstalled()) {
api.registerApp();
}
WeiboMultiMessage weiboMultiMessage = new WeiboMultiMessage();
Bitmap bitmap = mLatesBitmap;//截图bitmap
ImageObject imageObject = new ImageObject();
imageObject.setImageObject(bitmap);
weiboMultiMessage.imageObject = imageObject;
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMultiMessage;
boolean requestWeibo = api.sendRequest(request);
Log.i(TAG,"share to weibo:"+requestWeibo );
} else {
ToastUtils.show(mActivity, "您没有安装微博客户端");
}
}
总结
以上所述是小编给大家介绍的Android截屏分享功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对亿速云网站的支持!
-
安卓截图截屏相关-安卓5.0以上截屏不论是surfaceview还是其他的都可以顺利截屏需要的童鞋自己改下控制下...
2019-07-29 16:24:47安卓5.0以上截屏,不论是surfaceview还是其他的都可以顺利截屏,需要的童鞋自己改下,控制下截屏速率.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。 -
Android截屏、保存、分享
2021-06-09 05:59:25原理:将截取到的Bitmap赋给Dialog上的ImageView,并对Dialog加了弹出和收起的动画,实现截屏效果。首先创建一个layout名为show_cut_screen_layout用于弹出截图对话框,上面是一个image,下面是横向线性布局的两个...原理:将截取到的Bitmap赋给Dialog上的ImageView,并对Dialog加了弹出和收起的动画,实现截屏效果。
首先创建一个layout名为show_cut_screen_layout用于弹出截图对话框,上面是一个image,下面是横向线性布局的两个button。
然后设置对话框弹出的style:
进入values——style.xml里面添加如下代码:
接下来在res文件夹下新建一个anim文件夹用于保存对话框弹出和收起动画:
在里面新建popview_in_amin.xml :
和popview_out_amin.xml :
接下来是java代码:
//截屏功能
private void popShotSrceenDialog(){
final AlertDialog cutDialog = new AlertDialog.Builder(this).create();
View dialogView = View.inflate(this, R.layout.show_cut_screen_layout, null);
ImageView showImg = (ImageView) dialogView.findViewById(R.id.show_cut_screen_img);
dialogView.findViewById(R.id.share_cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cutDialog.dismiss();
}
});
dialogView.findViewById(R.id.share_img).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//分享
Uri pa=Uri.fromFile(new File(filePath));//根据路径转化为uri
Intent imageIntent = new Intent(Intent.ACTION_SEND);//调用系统的ACTION_SEND
imageIntent.setType("image/png");
imageIntent.putExtra(Intent.EXTRA_STREAM, pa);//EXTRA_STREAM对应转化为uri的path
startActivity(Intent.createChooser(imageIntent, "分享"));
}
});
//获取当前屏幕的大小
int width = getWindow().getDecorView().getRootView().getWidth();
int height = getWindow().getDecorView().getRootView().getHeight();
//生成相同大小的图片
Bitmap temBitmap = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 );
//找到当前页面的跟布局
View view = getWindow().getDecorView().getRootView();
//设置缓存
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
//从缓存中获取当前屏幕的图片
temBitmap = view.getDrawingCache();
//保存图片
if (temBitmap != null)
{
try {
// 获取内置SD卡路径
String sdCardPath = Environment.getExternalStorageDirectory().getPath();
// 图片文件路径,获取系统时间
long time=System.currentTimeMillis();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
java.util.Date date=new java.util.Date(time);
String str=sdf.format(date);
filePath = sdCardPath + File.separator +str+"screenshot.png";
File file = new File(filePath);
FileOutputStream os = new FileOutputStream(file);
temBitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
os.flush();
os.close();
} catch (Exception e) {
Toast.makeText(be_qrcode.this,"保存失败,请检查权限或清理内存",Toast.LENGTH_SHORT).show();
}
}
showImg.setImageBitmap(temBitmap);
cutDialog.setView(dialogView);
Window window = cutDialog.getWindow();
window.setBackgroundDrawableResource(android.R.color.transparent);
WindowManager m = window.getWindowManager();
Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
WindowManager.LayoutParams p = window.getAttributes(); // 获取对话框当前的参数值
p.height = (int) (d.getHeight() * 0.8); // 高度设置为屏幕的0.6
p.gravity = Gravity.CENTER;//设置弹出框位置
window.setAttributes(p);
window.setWindowAnimations(R.style.dialogWindowAnim);
cutDialog.show();
}
-
为什么 Android 截屏需要 root 权限
2021-06-05 11:17:13Android 截屏问题看到很多朋友都有一个需求:那就是截取 Android 的整个屏幕,而且大家都遇到一个相同的问题,没有权限。这篇文章主要从代码的角度分析,问什么需要权限,需要什么样的权限?对截屏方法也有一些分析...Android 截屏问题
看到很多朋友都有一个需求:那就是截取 Android 的整个屏幕,而且大家都遇到一个相同的问题,没有权限。这篇文章主要从代码的角度分析,问什么需要权限,需要什么样的权限?对截屏方法也有一些分析,欢迎大家讨论。
Android 截屏 -- 传统方法
一般最开始的 Android 截屏程序,都是来源于 Linux 的截屏方法,android 使用的 Linux 内核,那么 Linux 下的截屏方法也就最先被 android 采用。Linux 使用了 framebuffer 管理显示输出,传统的办法就是读取 framebuffer 的数据,然后得到整个屏幕的数据。此方法在 Android3.0 版本之前是也唯一可行的方法。 然而 linux 采用了严格的权限控制 设备文件,framebuffer 也是其控制之一,在 Android 中只有 root , 和 graphic 组用户才有权限读取:
ls -l /dev/graphics/fb0
crw-rw---- root graphics 29, 0 2015-01-16 03:26 fb0
所以要采用读取 framebuffer 的方式实现截屏,应用必须获得 root 权限。
随着 Android 显示系统的变迁,自 Android 4.2 开始, Android 自己增加截屏接口,而且更多的设备采用了多个 framebuffer 使用 overlay 的方式,更有采用硬件 composer 的设备,使得单独读取 framebuffer 并不能截取到,一个完整的屏幕。于是这个方法也渐渐被开发者抛弃。
Android 截屏 -- SurfaceFlinger
在 Android 4.0 里,显示系统采用了新的构架,加入“黄油计划”,同时也添加截屏接口:
status_t SurfaceFlinger::captureScreen(const sp& display,
sp* heap,
uint32_t* width, uint32_t* height, PixelFormat* format,
uint32_t sw, uint32_t sh,
uint32_t minLayerZ, uint32_t maxLayerZ)
{
if (CC_UNLIKELY(display == 0))
return BAD_VALUE;
if (!GLExtensions::getInstance().haveFramebufferObject())
return INVALID_OPERATION;
class MessageCaptureScreen : public MessageBase {
SurfaceFlinger* flinger;
sp display;
sp* heap;
uint32_t* w;
uint32_t* h;
PixelFormat* f;
uint32_t sw;
uint32_t sh;
uint32_t minLayerZ;
uint32_t maxLayerZ;
status_t result;
public:
MessageCaptureScreen(SurfaceFlinger* flinger, const sp& display,
sp* heap, uint32_t* w, uint32_t* h, PixelFormat* f,
uint32_t sw, uint32_t sh,
uint32_t minLayerZ, uint32_t maxLayerZ)
: flinger(flinger), display(display),
heap(heap), w(w), h(h), f(f), sw(sw), sh(sh),
minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
result(PERMISSION_DENIED)
{
}
status_t getResult() const {
return result;
}
virtual bool handler() {
Mutex::Autolock _l(flinger->mStateLock);
result = flinger->captureScreenImplLocked(display,
heap, w, h, f, sw, sh, minLayerZ, maxLayerZ);
return true;
}
};
sp msg = new MessageCaptureScreen(this,
display, heap, width, height, format, sw, sh, minLayerZ, maxLayerZ);
status_t res = postMessageSync(msg);
if (res == NO_ERROR) {
res = static_cast( msg.get() )->getResult();
}
return res;
}
现在应用可以调用系统接口来截屏,最好的例子就是 screencap : frameworks/base/cmds/screencap/screencap.cpp
然而,系统依然出于安全的考虑,对权限的控制依然严格:使用系统截屏接口需要 READ_FRAMEBUFFER 权限:
case CAPTURE_SCREEN:
{
// codes that require permission check
IPCThreadState* ipc = IPCThreadState::self();
const int pid = ipc->getCallingPid();
const int uid = ipc->getCallingUid();
if ((uid != AID_GRAPHICS) &&
!PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
ALOGE("Permission Denial: "
"can't read framebuffer pid=%d, uid=%d", pid, uid);
return PERMISSION_DENIED;
}
break;
}
而且 READ_FRAMEBUFFER 属于 system 级别的权限,非系统应用无法获得,所以在应用程序中声明了使用这个权限,应用程序如果不是 system 程序,依然没有权限。第三方程序要能截屏成功还是需要 root 。
Android 截屏 -- ddms
有的开发者就会发现,就算系统没有 root,依然可以通过 ddms 截屏成功。 为什么 ddms 可以在没有 root 的设备上截屏成功?
ddms 也是调用系统的截屏接口,而且他直接调用的是 screencap:
首先 ddms 通过 adb 发送信号给设备上的 adbd 守护进程,adbd 里面的 framebuffer service (system/core/adb/framebuffer_service.c ) 负责整个截屏过程:
void framebuffer_service(int fd, void *cookie)
{
struct fbinfo fbinfo;
unsigned int i;
char buf[640];
int fd_screencap;
int w, h, f;
int fds[2];
if (pipe(fds) < 0) goto done;
pid_t pid = fork();
if (pid < 0) goto done;
if (pid == 0) {
dup2(fds[1], STDOUT_FILENO);
close(fds[0]);
close(fds[1]);
const char* command = "screencap";
const char *args[2] = {command, NULL};
execvp(command, (char**)args);
exit(1);
}
fd_screencap = fds[0];
/* read w, h & format */
if(readx(fd_screencap, &w, 4)) goto done;
if(readx(fd_screencap, &h, 4)) goto done;
if(readx(fd_screencap, &f, 4)) goto done;
所以,实际上是 adbd 守护进程启动了 screencap;以没有root 的 mx3 为例:
shell@mx3:/ $ ps adbd
ps adbd
USER PID PPID VSIZE RSS WCHAN PC NAME
shell 3008 1 4648 272 ffffffff 00000000 S /sbin/adbd
shell@mx3:/ $ id shell
id shell
uid=2000(shell) gid=2000(shell) groups=1003(graphics),1004(input),1007(log),1009(mount),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats)
adbd 是以 shell 用户执行的, 而系统为 shell 用户分配 graphics 组,所以 shell 用户是有权限调用 surfaceflinger 的接口的。
总结
以上几种办法,除了 adb 不需要 root ,另外两种都需要 root 才能截屏。当然还有 android 的版本差异,造成接口函数也不一样,具体细节可以查看源代码。要实现自己的截屏功能,提升权限是必须的,但是我们也看到有些程序可以在没有 root 的设备上执行。那么我们可以推测,可以不要 root ,但是提升到 graphics 或者将应用提升到 system 级别都是可行的。希望这篇文章可以帮助还在寻找截屏方法的朋友。
-
Android截图以及加水印Demo
2021-06-09 11:21:02实现一个简单的截图功能以及给图片添加水印的功能,直接上代码!一、代码实现import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import ... -
Android截屏示例demo
2018-01-11 13:50:50此demo示例最终是通过执行adb shell指令实现截屏操作的,代码博客地址:http://blog.csdn.net/u013171283/article/details/79032369 -
android 截屏+保存图片+权限
2021-06-11 04:35:55public boolean setDecorViewImage(Activity activity){try {//整个手机屏幕的视图View view = activity.getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();... -
android截图事件监听的原理与实现
2021-01-20 10:02:24Android系统没有对用户截屏行为提供回调的api,所以我们只能走野路子来获取用户是否截屏了。一般大家都会采用如下两种方法 1.监听截屏图片所在目录变化(FileObserver) 2.监听媒体库的变化(ContentObserver) ... -
安卓手机怎么截屏?安卓手机截图快捷键功能图文详解
2021-06-11 10:01:50开启qq截图功能,甩一下就截屏。LG G2手机怎么截屏?怎么截图?很多网友都在问,下面就跟格子啦小编一起来看下吧~1.用第三方软件!2.安卓4.2以后可以按住音量-和关机键2秒即可3.直接用自带的快捷备忘录4.使用下拉菜单中... -
Android截屏的几种实现
2020-06-16 11:34:24最近我们的APP要求需要截屏功能,网上看了看大致有一下几种实现的方式,由于我们的机器是特定的设备,(类似于广告机,已经ROOT),所以就采用最简单的方式,只需在代码中执行shell命令即可实现,下面就给大家介绍... -
安卓截图截屏相关-关于android全屏截图无需root无状态栏.rar
2019-07-29 16:24:50关于android全屏截图,无需root,无状态栏.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。 -
Android 截屏并保存到本地(兼容Android 10.0)
2022-03-21 17:03:42截屏方法: /** * author:xingHai.zhao * duty: 截屏并返回保存地址 */ fun getWindowBitmapPath(): Uri? { val view = activity?.window?.decorView val bitmap: Bitmap = Bitmap.createB -
android后台服务悬浮窗动态截屏
2021-01-06 14:26:37使用android IntentService后台截屏并且实现悬浮窗口动态显示 -
Android实现全屏截图或长截屏功能
2021-01-04 02:31:59本文实例为大家分享了Android实现全屏截图或长截屏功能的具体代码,供大家参考,具体内容如下 全屏截图: /** * 传入的activity是要截屏的activity */ public static Bitmap getViewBitmap(Activity activity) { /... -
Android实现屏幕截图并保存截图到指定文件
2021-01-05 13:51:48Android屏幕截图并保存截取屏幕的图片到指定文件,具体内容如下 注意要添加权限: <uses android:name=android.permission.WRITE_EXTERNAL_STORAGE> 完整代码: package zhangphil.test; import android.app.... -
Android 截屏方式
2021-05-26 08:24:19} ListView实现截屏 /** * 截图listview * **/ public static Bitmap getListViewBitmap(ListView listView,String picpath) { int h = 0; Bitmap bitmap; // 获取listView实际高度 for (int i = 0; i (); i++) { h... -
Android实现截屏,将截图文件保存到本地文件夹
2021-06-09 07:09:58Android实现对当前界面截屏,并将截图文件存放至本地文件夹首先需要动态申请两项权限(Android6.0后危险权限之类的都需要动态申请),在AndroidManifest.xml中静态添加其中会报错提示Permission is only granted to ... -
Android 截屏监听分享
2021-11-01 16:18:21目录 前言 ... 监听截屏快捷按键 ( 由于厂商自定义Android系统的多样性,再加上快捷键的不同以及第三方应用,监听截屏快捷键这事基本不靠谱,可以直接忽略 )。 一、FileObserver对比ContentObse