Android--截屏(支持Android7.1.1,无需root)

版权声明:本文为博主转载文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/80898936

 
  1. import android.Manifest;

  2. import android.content.Context;

  3. import android.content.Intent;

  4. import android.content.pm.PackageManager;

  5. import android.graphics.Bitmap;

  6. import android.graphics.drawable.BitmapDrawable;

  7. import android.media.projection.MediaProjectionManager;

  8. import android.os.Build;

  9. import android.os.Bundle;

  10. import android.support.annotation.RequiresApi;

  11. import android.support.v7.app.AppCompatActivity;

  12. import android.util.Log;

  13. import android.view.View;

  14. import android.widget.Button;

  15. import android.widget.ImageView;

  16.  
  17. import java.util.ArrayList;

  18. import java.util.List;

  19.  
  20. public class MainActivity extends AppCompatActivity {

  21. MediaProjectionManager mediaProjectionManager;

  22. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

  23. @Override

  24. public void onCreate(Bundle savedInstanceState) {

  25. super.onCreate(savedInstanceState);

  26. setContentView(R.layout.activity_main);

  27.  
  28. checkPermission();

  29.  
  30. mediaProjectionManager = (MediaProjectionManager) getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);

  31. startActivityForResult(mediaProjectionManager.createScreenCaptureIntent(), 1);

  32.  
  33. final Button button = findViewById(R.id.bt_screenshot);

  34. final ImageView imageView = findViewById(R.id.img_display);

  35. button.setOnClickListener(new View.OnClickListener() {

  36. @Override

  37. public void onClick(View v) {

  38. if (MyApplication.mediaProjection != null) {

  39. MyApplication.time = System.currentTimeMillis();

  40. Bitmap bitmap = CreateBitmap.getInstance(MainActivity.this, true, null, "null").getBitmap();

  41. if (bitmap == null) {

  42. Log.i("img", "bitmap为空");

  43. } else {

  44. imageView.setBackground(new BitmapDrawable(null, bitmap));

  45. }

  46. } else {

  47. Log.i("img", "未获取到截屏权限");

  48. }

  49. }

  50. });

  51.  
  52. }

  53.  
  54. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

  55. @Override

  56. protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  57. super.onActivityResult(requestCode, resultCode, data);

  58. MyApplication.mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);

  59. }

  60.  
  61. public void checkPermission() {

  62. final List<String> permissionsList = new ArrayList<>();

  63. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

  64. if ((checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {

  65. permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);

  66. } else {

  67. }

  68.  
  69. if (permissionsList.size() != 0) {

  70. requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),

  71. 100);

  72. }

  73. }

  74. }

  75.  
  76. @RequiresApi(api = Build.VERSION_CODES.M)

  77. @Override

  78. public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

  79. if (requestCode == 100) {

  80. if (grantResults.length > 0 && (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {

  81. } else {

  82. Log.i("img", "未获取权限");

  83. }

  84. }///instant-run

  85. }

  86.  
  87. }

 

 
  1. import android.content.Context;

  2. import android.content.Intent;

  3. import android.graphics.Bitmap;

  4. import android.graphics.PixelFormat;

  5. import android.hardware.display.DisplayManager;

  6. import android.hardware.display.VirtualDisplay;

  7. import android.media.Image;

  8. import android.media.ImageReader;

  9. import android.media.projection.MediaProjection;

  10. import android.net.Uri;

  11. import android.os.Build;

  12. import android.os.Environment;

  13. import android.support.annotation.RequiresApi;

  14. import android.util.DisplayMetrics;

  15. import android.util.Log;

  16. import android.view.WindowManager;

  17. import android.widget.Toast;

  18.  
  19. import java.io.File;

  20. import java.io.FileNotFoundException;

  21. import java.io.FileOutputStream;

  22. import java.io.IOException;

  23. import java.nio.ByteBuffer;

  24.  
  25. import static android.content.Context.WINDOW_SERVICE;

  26.  
  27. /**

  28. * Created by Administrator on 2017/3/16.

  29. */

  30.  
  31. public class CreateBitmap {

  32. private static MediaProjection mediaProjection = MyApplication.mediaProjection;

  33. private static ImageReader mImageReader;

  34. private static VirtualDisplay virtualDisplay1;

  35. private static DisplayMetrics displayMetrics = new DisplayMetrics();

  36. private static WindowManager windowManager;

  37. private static Bitmap bmp, bitmap;

  38. private static Image image;

  39. private static int width;

  40. private static int height;

  41. private static int pixelStride;

  42. private static int rowStride;

  43. private static int rowPadding;

  44. private static String path, name;

  45. private static int screenwidth, screenheight;

  46. private static Image.Plane[] planes;

  47. static ByteBuffer buffer;

  48.  
  49. private static class singleHolder {

  50. static final CreateBitmap createbitmap = new CreateBitmap();

  51. }

  52.  
  53. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

  54. public static CreateBitmap getInstance(final Context context, final Boolean isSave, String inpath, String inname) {

  55. init(context, inpath, inname);

  56. if (image != null) {

  57. analysesImage();

  58. long time = System.currentTimeMillis() - MyApplication.time;

  59. Log.i("img", "截图已生成" + time);

  60. if (isSave)

  61. savePic(context);

  62. }

  63. return singleHolder.createbitmap;

  64. }

  65.  
  66. private static void loop() {

  67. do {

  68. try {

  69. Thread.sleep(10);

  70. } catch (InterruptedException e) {

  71. e.printStackTrace();

  72. }

  73. } while (image != null);

  74.  
  75. }

  76.  
  77. // 初始化操作

  78. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

  79. private static void init(final Context context, String inpath, String inname) {

  80. if (bitmap != null) {

  81. bitmap = null;

  82. }

  83. path = inpath;

  84. name = inname;

  85. windowManager = (WindowManager) context.getSystemService(WINDOW_SERVICE);

  86. windowManager.getDefaultDisplay().getMetrics(displayMetrics);

  87. screenwidth = displayMetrics.widthPixels;

  88. screenheight = displayMetrics.heightPixels;

  89. mImageReader = ImageReader.newInstance(screenwidth, screenheight, PixelFormat.RGBA_8888, 2);

  90. virtualDisplay1 = mediaProjection.createVirtualDisplay("screen-mirror", screenwidth, screenheight, displayMetrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);

  91. do {

  92. try {

  93. Thread.sleep(10);

  94. image = mImageReader.acquireLatestImage();

  95. } catch (InterruptedException e) {

  96. e.printStackTrace();

  97. }

  98. } while (image == null);

  99. }

  100.  
  101. //解析image

  102. private static void analysesImage() {

  103. planes = image.getPlanes();

  104. buffer = planes[0].getBuffer();

  105. width = image.getWidth();

  106. height = image.getHeight();

  107. pixelStride = planes[0].getPixelStride();

  108. rowStride = planes[0].getRowStride();

  109. rowPadding = rowStride - pixelStride * width;

  110. bmp = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);

  111. bmp.copyPixelsFromBuffer(buffer);

  112. bitmap = Bitmap.createScaledBitmap(bmp, bmp.getWidth(), bmp.getHeight(), false);

  113. image.close();

  114. }

  115.  
  116. //保存图片

  117. private static void savePic(Context context) {

  118. if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) && bitmap != null) {

  119. if (path == null) {

  120. path = Environment.getExternalStorageDirectory().getPath() + "/Android/screen";

  121. } else {

  122. path = Environment.getExternalStorageDirectory().getPath() + path;

  123. }

  124. File file = new File(path);

  125. if (!file.exists()) {

  126. file.mkdir();

  127. }

  128. if (name == null) {

  129. name = System.currentTimeMillis() + "";

  130. }

  131. File file1 = new File(file, name + ".jpg");

  132. try {

  133. FileOutputStream fileOutputStream = new FileOutputStream(file1);

  134. bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);

  135. fileOutputStream.flush();

  136. fileOutputStream.close();

  137. Log.i("img", "截屏已保存到本地" + path);

  138. Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

  139. Uri uri = Uri.fromFile(file1);

  140. intent.setData(uri);

  141. context.sendBroadcast(intent);

  142. } catch (FileNotFoundException e) {

  143. e.printStackTrace();

  144. } catch (IOException e) {

  145. e.printStackTrace();

  146. }

  147. }

  148.  
  149. }

  150.  
  151. public Bitmap getBitmap() {

  152. return bitmap;

  153. }

  154. }

 

 
  1. import android.app.Application;

  2. import android.media.projection.MediaProjection;

  3.  
  4. public class MyApplication extends Application {

  5. public static MediaProjection mediaProjection;

  6. public static long time;

  7. }

 
  1. import android.Manifest;

  2. import android.app.Activity;

  3. import android.content.Context;

  4. import android.content.Intent;

  5. import android.content.pm.PackageManager;

  6. import android.graphics.Bitmap;

  7. import android.graphics.PixelFormat;

  8. import android.hardware.display.DisplayManager;

  9. import android.hardware.display.VirtualDisplay;

  10. import android.media.Image;

  11. import android.media.ImageReader;

  12. import android.media.projection.MediaProjection;

  13. import android.media.projection.MediaProjectionManager;

  14. import android.net.Uri;

  15. import android.os.Build;

  16. import android.os.Bundle;

  17. import android.os.Environment;

  18. import android.os.Handler;

  19. import android.support.annotation.RequiresApi;

  20. import android.util.DisplayMetrics;

  21. import android.util.Log;

  22. import android.view.WindowManager;

  23.  
  24. import java.io.File;

  25. import java.io.FileNotFoundException;

  26. import java.io.FileOutputStream;

  27. import java.io.IOException;

  28. import java.nio.ByteBuffer;

  29. import java.util.ArrayList;

  30. import java.util.List;

  31.  
  32. /**

  33. * Created by Administrator on 2017/3/8.

  34. */

  35.  
  36. public class ScreenShotActivity extends Activity {

  37. MediaProjectionManager mediaProjectionManager;

  38. MediaProjection mediaProjection;

  39. ImageReader mImageReader;

  40. VirtualDisplay virtualDisplay1;

  41. DisplayMetrics displayMetrics;

  42. WindowManager windowManager;

  43. String name, path;

  44.  
  45. @Override

  46. protected void onCreate(Bundle savedInstanceState) {

  47. super.onCreate(savedInstanceState);

  48. Intent intent = getIntent();

  49. name = intent.getStringExtra("name");

  50. path = intent.getStringExtra("path");

  51. checkPermission();

  52. }

  53. public void requestCapturePermission() {

  54.  
  55. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

  56. //5.0 之后才允许使用屏幕截图

  57. return;

  58. }

  59.  
  60. mediaProjectionManager = (MediaProjectionManager)

  61. getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);

  62.  
  63. startActivityForResult(

  64. mediaProjectionManager.createScreenCaptureIntent(),

  65. 1);

  66. }

  67.  
  68. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

  69. @Override

  70. protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  71. super.onActivityResult(requestCode, resultCode, data);

  72. mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);

  73. // try {

  74. // Thread.sleep(1000*5);

  75. // } catch (InterruptedException e) {

  76. // e.printStackTrace();

  77. // }

  78. captureScreen();

  79. }

  80.  
  81. public void checkPermission() {

  82. final List<String> permissionsList = new ArrayList<>();

  83. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

  84. if ((checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {

  85. permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);

  86. } else {

  87. requestCapturePermission();

  88. }

  89.  
  90. if (permissionsList.size() != 0) {

  91. requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),

  92. 100);

  93. }

  94. }

  95. }

  96.  
  97. @RequiresApi(api = Build.VERSION_CODES.M)

  98. @Override

  99. public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

  100. if (requestCode == 100) {

  101. if (grantResults.length > 0 && (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {

  102. requestCapturePermission();

  103. } else {

  104. Log.e("ScreenShotActivity", "未获取权限");

  105. }

  106. }///instant-run

  107. }

  108.  
  109. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

  110. public void captureScreen() {

  111. displayMetrics = new DisplayMetrics();

  112. windowManager = (WindowManager) this.getSystemService(WINDOW_SERVICE);

  113. windowManager.getDefaultDisplay().getMetrics(displayMetrics);

  114. int width = displayMetrics.widthPixels;

  115. int height = displayMetrics.heightPixels;

  116. mImageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);

  117. virtualDisplay1 = mediaProjection.createVirtualDisplay("screen-mirror", width, height, displayMetrics.densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null);

  118. Handler handler = new Handler();

  119. handler.postDelayed(new Runnable() {

  120. @Override

  121. public void run() {

  122. Image image = mImageReader.acquireLatestImage();

  123. if (image != null) {

  124. final Image.Plane[] planes = image.getPlanes();

  125. final ByteBuffer buffer = planes[0].getBuffer();

  126. int width = image.getWidth();

  127. int height = image.getHeight();

  128. int pixelStride = planes[0].getPixelStride();

  129. int rowStride = planes[0].getRowStride();

  130. int rowPadding = rowStride - pixelStride * width;

  131. Bitmap bmp = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);

  132. bmp.copyPixelsFromBuffer(buffer);

  133. Bitmap bitmap = Bitmap.createScaledBitmap(bmp, bmp.getWidth(), bmp.getHeight(), false);

  134. if(bitmap!=null){

  135. long spendtimes = System.currentTimeMillis() - MyApplication.time;

  136. Log.e("ScreenShotActivity", "bitmap成功时间" + spendtimes);

  137. }

  138. setSavePic(bitmap);

  139. bitmap.recycle();

  140. image.close();

  141. }

  142. }

  143. }, 500);

  144. }

  145.  
  146. private void setSavePic(Bitmap bitmap) {//保存截屏到本地

  147. if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {

  148. if (path == null) {

  149. path = Environment.getExternalStorageDirectory().getPath() + "/截屏";

  150. } else {

  151. path = Environment.getExternalStorageDirectory().getPath() + "/" + path;

  152. }

  153. File file = new File(path);

  154. if (!file.exists()) {

  155. file.mkdir();

  156. }

  157. if (name == null) {

  158. name = System.currentTimeMillis() + "";

  159. }

  160. File file1 = new File(file, name + ".jpg");

  161. try {

  162. FileOutputStream fileOutputStream = new FileOutputStream(file1);

  163. bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);

  164. fileOutputStream.flush();

  165. fileOutputStream.close();

  166. // Toast.makeText(this, "截屏已保存到本地" + path, Toast.LENGTH_SHORT).show();

  167. Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

  168. Uri uri = Uri.fromFile(file1);

  169. intent.setData(uri);

  170. sendBroadcast(intent);

  171. finish();

  172. } catch (FileNotFoundException e) {

  173. e.printStackTrace();

  174. } catch (IOException e) {

  175. e.printStackTrace();

  176. }

  177. }

  178. }

  179. }

 

 
  1. import android.content.Context;

  2. import android.content.Intent;

  3.  
  4.  
  5. public class ShotClass {

  6. private static class SingleHolder {

  7. static final ShotClass shot = new ShotClass();

  8. }

  9.  
  10. public static ShotClass getInstance() {

  11. return SingleHolder.shot;

  12. }

  13.  
  14. public void createShot(Context context, String path, String name) {

  15. Intent intent = new Intent(context, ScreenShotActivity.class);

  16. intent.putExtra("path", path);

  17. intent.putExtra("name", name);

  18. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

  19. context.startActivity(intent);

  20. }

  21. }

 
  1. <activity android:name=".utils.screen.ScreenShotActivity"

  2. android:launchMode="singleInstance"

  3. android:taskAffinity=""

  4. android:theme="@style/AppThemeTranslucent"

  5. />

 
  1. <style name="AppThemeTranslucent" parent="android:Theme.Translucent">

  2.  
  3. <item name="android:windowIsTranslucent">true</item>

  4. <item name="android:colorBackgroundCacheHint">@null</item>

  5. <item name="android:windowBackground">@android:color/transparent</item>

  6. <item name="android:windowContentOverlay">@null</item>

  7. <item name="android:windowNoTitle">true</item>

  8. <item name="android:windowIsFloating">true</item>

  9. <item name="android:backgroundDimEnabled">false</item>

  10.  
  11. </style>

下面是style的一些属性及其解释:

  • <style name="dialog_translucent" parent="@android:style/Theme.Dialog">

  • <item name="android:windowFrame">@null</item><!-- 边框 -->

  • <item name="android:windowIsFloating">true</item><!-- 是否悬浮在activity上 -->

  • <item name="android:windowIsTranslucent">false</item><!-- 半透明 -->

  • <item name="android:windowNoTitle">true</item><!-- 无标题 -->

  • <item name="android:windowBackground">@android:color/transparent</item><!-- 背景透明 -->

  • <item name="android:backgroundDimEnabled">false</item><!-- 模糊 -->

  • <item name="android:backgroundDimAmount">0.6</item><!-- 灰度 -->

  • <item name="android:windowContentOverlay">@null</item><!-- 对话框是否有遮盖 -->

  • <item name="android:windowAnimationStyle">@style/dialog_animation</item><!-- 弹出或者进入时的动画效果 -->

  • <item name="android:colorBackgroundCacheHint">@null</item><!-- 背景缓存颜色 -->

  •  
  • </style>

  • --------------------- 本文来自 chaoyu168 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/chaoyu168/article/details/80898936?utm_source=copy

源码下载:https://download.csdn.net/download/chaoyu168/10516429

引用:

startActivity(new Intent(this, ScreenShotActivity.class));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值