android完美截屏

原创 2015年07月08日 11:58:19


1
android开发中通过View的getDrawingCache方法可以达到截屏的目的,只是缺少状态栏!

原始界面

图1


截屏得到的图片

图1


代码实现

1. 添加权限(AndroidManifest.xml文件里)


1
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 添加1个Button(activity_main.xml文件)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world" />
     
    <Button
        android:id="@+id/btn_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Screenshot"
        />
 
</RelativeLayout>



3. 实现截屏(MainActivity.java文件)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.example.androidtest;
 
import java.io.File;
import java.io.FileOutputStream;
 
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
 
public class MainActivity extends Activity {
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        Button btn = (Button) this.findViewById(R.id.btn_save);
        btn.setOnClickListener(new View.OnClickListener() {
             
            @Override
            public void onClick(View v) {
                screenshot();
            }
        });
    }
     
    private void screenshot()
    {
        // 获取屏幕
        View dView = getWindow().getDecorView(); 
        dView.setDrawingCacheEnabled(true);  
        dView.buildDrawingCache();  
        Bitmap bmp = dView.getDrawingCache();
        if (bmp != null)
        {
            try {
                // 获取内置SD卡路径
                String sdCardPath = Environment.getExternalStorageDirectory().getPath();
                // 图片文件路径
                String filePath = sdCardPath + File.separator + "screenshot.png";
                 
                File file = new File(filePath);
                FileOutputStream os = new FileOutputStream(file);
                bmp.compress(Bitmap.CompressFormat.PNG, 100, os);
                os.flush();
                os.close();
            } catch (Exception e) {
            }
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
 
}

1

android开发中通过View的getDrawingCache方法可以达到截屏的目的,只是缺少状态栏!

原始界面

图1


截屏得到的图片

图1


代码实现

1. 添加权限(AndroidManifest.xml文件里)


?
1
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 添加1个Button(activity_main.xml文件)



?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world" />
     
    <Button
        android:id="@+id/btn_save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Screenshot"
        />
 
</RelativeLayout>



3. 实现截屏(MainActivity.java文件)


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.example.androidtest;
 
import java.io.File;
import java.io.FileOutputStream;
 
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
 
public class MainActivity extends Activity {
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        Button btn = (Button) this.findViewById(R.id.btn_save);
        btn.setOnClickListener(new View.OnClickListener() {
             
            @Override
            public void onClick(View v) {
                screenshot();
            }
        });
    }
     
    private void screenshot()
    {
        // 获取屏幕
        View dView = getWindow().getDecorView(); 
        dView.setDrawingCacheEnabled(true);  
        dView.buildDrawingCache();  
        Bitmap bmp = dView.getDrawingCache();
        if (bmp != null)
        {
            try {
                // 获取内置SD卡路径
                String sdCardPath = Environment.getExternalStorageDirectory().getPath();
                // 图片文件路径
                String filePath = sdCardPath + File.separator + "screenshot.png";
                 
                File file = new File(filePath);
                FileOutputStream os = new FileOutputStream(file);
                bmp.compress(Bitmap.CompressFormat.PNG, 100, os);
                os.flush();
                os.close();
            } catch (Exception e) {
            }
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
 
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android完美实现截屏

很多app都有截屏的需求,当你遇到产品经理给你提出这个需求时,你搜索了一下: 1.取View的cacheDrawable 来实现截屏,这种方案,没有兼容性问题,但是缺点有两个: 不能截状态...
  • weizongwei5
  • weizongwei5
  • 2017年01月10日 11:40
  • 16072

Android截屏方法总结

最近研究了一些Android的截屏方法,做一个总结。
  • A38017032
  • A38017032
  • 2017年04月23日 09:38
  • 1943

android 应用内页面,截屏监听

公司的项目由于安全需要,对某一特定的页面需要监听是否被用户截屏了。 简单搜了一下,很少有这方面的问题,没办法,只能自己折腾了。 目前想到两种思路: 1、监听广播 当然,前提是系统在截屏的时候发送某...
  • sollian
  • sollian
  • 2016年05月20日 19:03
  • 5316

Android系统 截屏监听 的 原理与实现

Android系统并没有提供截屏通知相关的API,需要我们自己利用系统能提供的相关特性变通实现。Android系统有一个媒体数据库,每拍一张照片,或使用系统截屏截取一张图片,都会把这张图片的详细信息加...
  • xietansheng
  • xietansheng
  • 2016年10月16日 18:35
  • 10009

【Android】实现截屏功能

1.截屏功能在像QQ等软件中我们有所
  • u010119170
  • u010119170
  • 2014年07月29日 02:22
  • 1322

android实现截屏操作

最近开发了一些Android小游戏,想在游戏结束或者完成之后把整个屏幕截取下来并分享到社交平台上。先上效果吧。 网上一搜,截屏的方法很多。这里只贴出了一种,将截取到Bitmap赋给D...
  • Tom_xiaoxie
  • Tom_xiaoxie
  • 2016年06月02日 11:41
  • 1070

【android4.3】记一次完整的android源码截屏事件的捕获(不同于网上的老版本)

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景        我们知道android提供了一个系统截屏功能,就是按住电源键和音量减的按键0.5秒,系统...
  • gshengod
  • gshengod
  • 2014年02月26日 09:19
  • 11593

Android和iPhone截屏快捷键

截屏快捷键(Power + Home) 其实在手机上截屏非常容易。只要同时按住关机键(Power)和主页键(Home)一会儿,系统就会将当前屏幕作为图片存储在手机相册里。 已经在HTC E...
  • czjuttsw
  • czjuttsw
  • 2013年01月08日 15:08
  • 1454

Android笔记:禁止系统截屏的代码

Android 禁止系统截屏 截屏代码 解除禁止截屏 Java android安全
  • xiaoyu940601
  • xiaoyu940601
  • 2016年11月17日 10:57
  • 1279

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

根据上一篇文章Android 4.4系统原生截图解析 ,我们知道系统截屏是调用了TakeScreenshotService,为实现在任何界面都能实现三指截屏,我们就得在PhoneWindow(fram...
  • QQxiaoqiang1573
  • QQxiaoqiang1573
  • 2016年11月28日 11:07
  • 2421
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android完美截屏
举报原因:
原因补充:

(最多只允许输入30个字)