精华内容
下载资源
问答
  • Android截图指令
    千次阅读
    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轻量级的截屏工具非常的好用 1.把脚本放入指定目录下面: C:\Users\****\AppData\Local\Android\Sdk\platform-tools 2.把用手机打开想要截图的页面双击运行此脚本,图片就截取到脚本所在的文件夹
  • 主要介绍了 Android截屏截图方法汇总(Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)的相关资料,需要的朋友可以参考下
  • Android 截屏 APP 工具.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • android截屏上传图片到服务器.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 主要为大家详细介绍了Android截屏SurfaceView黑屏问题的解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Android系统没有直接对截屏事件监听的接口,也没有广播,只能自己动手来丰衣足食,一般有三种方法。 利用FileObserver监听某个目录中资源变化情况 利用ContentObserver监听全部资源的变化 监听截屏快捷按键 由于...
  • 主要为大家详细介绍了android实现手机截屏并保存截图功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Android截屏分享功能

    2021-05-28 02:09:56
    Android截屏分享功能发布时间: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还是其他的都可以顺利截屏,需要的童鞋自己改下,控制下截屏速率.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 原理:将截取到的Bitmap赋给Dialog上的ImageView,并对Dialog加了弹出和收起的动画,实现截屏效果。首先创建一个layout名为show_cut_screen_layout用于弹出截图对话框,上面是一个image,下面是横向线性布局的两个...

    原理:将截取到的Bitmap赋给Dialog上的ImageView,并对Dialog加了弹出和收起的动画,实现截屏效果。

    首先创建一个layout名为show_cut_screen_layout用于弹出截图对话框,上面是一个image,下面是横向线性布局的两个button。

    65297d5971ce591948dbd027f994fc7c.png

    然后设置对话框弹出的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 截屏问题看到很多朋友都有一个需求:那就是截取 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 级别都是可行的。希望这篇文章可以帮助还在寻找截屏方法的朋友。

    展开全文
  • 实现一个简单的截图功能以及给图片添加水印的功能,直接上代码!一、代码实现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
  • public boolean setDecorViewImage(Activity activity){try {//整个手机屏幕的视图View view = activity.getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();...
  • Android系统没有对用户截屏行为提供回调的api,所以我们只能走野路子来获取用户是否截屏了。一般大家都会采用如下两种方法 1.监听截屏图片所在目录变化(FileObserver) 2.监听媒体库的变化(ContentObserver)  ...
  • 开启qq截图功能,甩一下就截屏。LG G2手机怎么截屏?怎么截图?很多网友都在问,下面就跟格子啦小编一起来看下吧~1.用第三方软件!2.安卓4.2以后可以按住音量-和关机键2秒即可3.直接用自带的快捷备忘录4.使用下拉菜单中...
  • Android截屏的几种实现

    千次阅读 2020-06-16 11:34:24
    最近我们的APP要求需要截屏功能,网上看了看大致有一下几种实现的方式,由于我们的机器是特定的设备,(类似于广告机,已经ROOT),所以就采用最简单的方式,只需在代码中执行shell命令即可实现,下面就给大家介绍...
  • 关于android全屏截图,无需root,无状态栏.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • 截屏方法: /** * author:xingHai.zhao * duty: 截屏并返回保存地址 */ fun getWindowBitmapPath(): Uri? { val view = activity?.window?.decorView val bitmap: Bitmap = Bitmap.createB
  • 使用android IntentService后台截屏并且实现悬浮窗口动态显示
  • 本文实例为大家分享了Android实现全屏截图或长截屏功能的具体代码,供大家参考,具体内容如下 全屏截图: /** * 传入的activity是要截屏的activity */ public static Bitmap getViewBitmap(Activity activity) { /...
  • Android屏幕截图并保存截取屏幕的图片到指定文件,具体内容如下 注意要添加权限: <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实现对当前界面截屏,并将截图文件存放至本地文件夹首先需要动态申请两项权限(Android6.0后危险权限之类的都需要动态申请),在AndroidManifest.xml中静态添加其中会报错提示Permission is only granted to ...
  • Android 截屏监听分享

    2021-11-01 16:18:21
    目录 前言 ... 监听截屏快捷按键 ( 由于厂商自定义Android系统的多样性,再加上快捷键的不同以及第三方应用,监听截屏快捷键这事基本不靠谱,可以直接忽略 )。 一、FileObserver对比ContentObse

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 112,134
精华内容 44,853
关键字:

安卓截屏