android 应用使用截屏功能


方法一 利用SystemUI的TakeScreenshotService服务:

    
    private ServiceConnection mScreenshotConnection = null;
    private final Object mScreenshotLock = new Object();
    private final Runnable mScreenshotTimeout = new Runnable() {
        public void run() {
            synchronized (mScreenshotLock) {
                if (mScreenshotConnection != null) {
                    mCtx.unbindService(mScreenshotConnection);
                    mScreenshotConnection = null;                                                                                                                                
                }
                return;
            }
        }
    };

    private void takeScreenshot() {
        synchronized (mScreenshotLock) {
            if (mScreenshotConnection != null) {
                return;
            }
            ComponentName cn = new ComponentName("com.android.systemui",
                    "com.android.systemui.screenshot.TakeScreenshotService");
            Intent intent = new Intent();
            intent.setComponent(cn);
            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, 1);
                        final ServiceConnection myConn = this;

                        Handler h = new Handler(mHandler.getLooper()) {

                            @Override
                            public void handleMessage(Message msg) {
                                synchronized (mScreenshotLock) {
                                    if (mScreenshotConnection == myConn) {
                                        mContext.unbindService(mScreenshotConnection);
                                        mScreenshotConnection = null;
                                        mHandler.removeCallbacks(mScreenshotTimeout);
                                    }
                                }
                            }
                        };
                        msg.replyTo = new Messenger(h);
                        msg.arg1 = msg.arg2 = 1;
                        try {
                            messenger.send(msg);
                        } catch (RemoteException e) {
                        }
                    }
                }

                @Override
                public void onServiceDisconnected(ComponentName name) {
                }
            };
            if (mContext.bindServiceAsUser(intent, conn,
                    Context.BIND_AUTO_CREATE, UserHandle.CURRENT)) {
                mScreenshotConnection = conn;
                mHandler.postDelayed(mScreenshotTimeout, 10000);
            }
        }
    }

    public void onClick(View view){
        if (mScreenshotConnection == null){          
           takeScreenshot()
        }
    }
       
   
 

方法二 利用SurfaceControl.screenshot:

public class ScreenShotUtil {
    private Context mContext;
    private Display mDisplay;
    private Matrix mDisplayMatrix;
    private DisplayMetrics mDisplayMetrics;
    private Bitmap mScreenBitmap;
    private WindowManager mWindowManager;

    public ScreenShotUtil(Context paramContext) {
        this.mContext = paramContext;
    }

    private float getDegreesForRotation(int value) {
        switch (value) {
        case Surface.ROTATION_90:
            return 360f - 90f;
        case Surface.ROTATION_180:
            return 360f - 180f;
        case Surface.ROTATION_270:
            return 360f - 270f;
        }
        return 0f;
    }
    public Boolean ScreenShot() {
        mDisplayMatrix = new Matrix();
        mWindowManager = ((WindowManager) this.mContext
                .getSystemService("window"));
        mDisplay = mWindowManager.getDefaultDisplay();
        mDisplayMetrics = new DisplayMetrics();
        mDisplay.getRealMetrics(mDisplayMetrics);
        float[] dims = {mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels};
        // SPRD: if rotation is 90,then rot = (rot + 1) % 4
        int rot = mDisplay.getRotation();
        if (SystemProperties.getInt("ro.sf.hwrotation", 0) == 270) {
            rot = (rot + 3) % 4;
        }
        float degrees = getDegreesForRotation(rot);
        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]);
        }
        mScreenBitmap = SurfaceControl.screenshot((int) dims[0], (int) dims[1]);
        
        if (mScreenBitmap==null){
            return false;
        }
        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();
        return true;

    }

    public Bitmap getBitmap() {
        return this.mScreenBitmap;
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 截屏功能开发有多种方法,以下是一些常见的实现方式: 1. 使用 View 的 getDrawingCache() 方法: - 添加权限(AndroidManifest.xml 文件里) - 代码实现: ```java View view = ...; // 需要截图的 View Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); ``` 2. 使用 MediaProjectionManager: - 缺点:只能截应用页面,状态栏不会被截进去,对于全屏截图的需求不适用。因为 getWindow() 是 Activity 中的方法,所以只能在 Activity 中调用(无法后台截屏)。 3. 使用 SurfaceControl.screenshot: - 优点:使用无限制,可以在后台使用功能强大,且调用方式简单不用向用户申请权限,同时也无任何弹窗显示。 - 具体使用方式可参考这篇文章:SurfaceControl.screenshot() 用法。 4. 使用 ViewTreeObserver.OnGlobalLayoutListener: - 在 onGlobalLayout() 方法中获取 View 的宽高和绘制缓存,然后创建 Bitmap。 - 示例代码: ```java view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int width = view.getWidth(); int height = view.getHeight(); view.getViewTreeObserver().removeOnGlobalLayoutListener(this); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); } }); ```<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值