/*** 作者:CnPeng* <p>* 时间:2017/6/27:下午3:06* <p>* 说明:应用程序内部截屏的实现(不截状态栏,兼容5.0 以上及以下版本)* -- 申请写入SD的权限* -- 实现应用内截取屏幕的功能(不截状态栏)* -- 计算状态栏的高度(两种方式)* -- 发送广播通知相册/图库刷新数据*/public class ScreenShotActivity extends AppCompatActivity {private Button bt_screenShot;private ImageView iv_showScreenShot;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_screen_shot);initView();initEvent();}private void initView() {bt_screenShot = (Button) findViewById(R.id.bt_clickToScreenShot);iv_showScreenShot = (ImageView) findViewById(R.id.iv_showScreenShot);}private void initEvent() {bt_screenShot.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) { //点击之后,保存截图,更新相册Bitmap bitmap = getScreenShotBmp();boolean saveSuccess = saveScreenShotToSD(bitmap);String hint = saveSuccess ? "保存成功" : "保存失败";Toast.makeText(ScreenShotActivity.this, hint, Toast.LENGTH_SHORT).show();if (saveSuccess) {iv_showScreenShot.setImageBitmap(bitmap);}}});}/*** 发送广播更新相册,不更新的话,在相册中将无法查看到截取的图片*/private void updateGallery(File file) {Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);Uri uri = Uri.fromFile(file);intent.setData(uri);sendBroadcast(intent);}/*** 保存截图到本地** @param bitmap 截取到的图片*/private boolean saveScreenShotToSD(Bitmap bitmap) {if (bitmap != null) {if (Environment.getExternalStorageState().equals(MEDIA_MOUNTED)) { //如果SD存储设备可用String path = Environment.getExternalStorageDirectory().getPath() + File.separator + "校园集结号";File dir = new File(path);if (!dir.exists()) {dir.mkdir(); //创建目录}File file = new File(dir, "截图成功.png");FileOutputStream fos = null;try {fos = new FileOutputStream(file);//根据指定的格式、质量、输出流 将bitmap保存到本地,并返回是否保存成功boolean saveSuccess = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);if (saveSuccess) {updateGallery(file); //刷新相册}return saveSuccess;} catch (FileNotFoundException e1) {e1.printStackTrace();return false;} finally {if (fos != null) {try {fos.close(); //关闭流防止溢出} catch (IOException e1) {e1.printStackTrace();}}}} else {Toast.makeText(this, "本地存储空间不可用", Toast.LENGTH_SHORT).show();}}return false;}/*** 获取屏幕截图*/private Bitmap getScreenShotBmp() {View decorView = getWindow().getDecorView(); //获取当前activity所在的最顶层的view--DecorViewdecorView.setDrawingCacheEnabled(true); //启用绘图缓存decorView.buildDrawingCache(); //强制构建绘图缓存(防止上面启用绘图缓存的操作失败)Bitmap bitmap = decorView.getDrawingCache(); //获取绘图缓存中的 bitmap// int statusBarHeight = getStatusBarHeight();int statusBarHeight = getStatusBarHeight(decorView);int newBmpHeight = bitmap.getHeight() - statusBarHeight; //最终截取的图片的高度(取出状态栏之后的高度)bitmap = Bitmap.createBitmap(bitmap, 0, statusBarHeight, bitmap.getWidth(), newBmpHeight);decorView.setDrawingCacheEnabled(false); //createBitmap完成之后一定要置为false,否则短时间内多次截图时内容不会变化!return bitmap;}/*** 获取状态栏高度方式2** @param decorView 要获取状态栏高度的页面所在的顶层布局*/private int getStatusBarHeight(View decorView) {Rect rect = new Rect();decorView.getWindowVisibleDisplayFrame(rect);return rect.top;}/*** 获取状态栏的高度--方式1*/public int getStatusBarHeight() {int statusBarHeight = 0;int resourceID = getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceID != 0) {statusBarHeight = getResources().getDimensionPixelSize(resourceID);}return statusBarHeight;}}
详细解决方案
Android:应用内部截屏的实现
热度:30 发布时间:2023-09-12 01:40:59.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android RadioButton如何设置默认选中
- android 怎么重新设置锚点
- android 图片对象获取的有关问题
- android 关于服务连接的疑义
- android 怎么实现对view的放大和缩小
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java) 中文乱码的有关问题
- android 动态设立控件高度
- Android test project 编译方法
- android 4.03启动出错,显示"Encryption Unsuccessful"该如何解决
- Android 下面的listView的动态效果怎么实现的?求源代码,多谢
- Android?Palm?Symbian?Windows Mobile?学哪个有“钱图”?解决方案
- Android 开发语言,该怎么解决
- 单个人去做手机开发选什么平台好?android,iphone?解决办法
- Android 虚拟机崩溃的有关问题
- 想学学移动平台的开发 android 还是windows phone7好啊该怎么处理
- Android 上的如何读写设备文件
- Android 2.2 API 汉语文档系列(3) —— AccessibilityService
- 【先睹为快】ArcGIS Android SDK上一版本新特性
- ArcGIS for Android app v2.0.4公布
- android.hardware.USB种介绍
- android linux开发 在线电子书解决方案