梅特勒杯创新大赛(四):Android的相机使用与屏幕截图

xiaoxiao2021-02-28  70

这一部分我们将探讨对于Android手机相机的调用以及当前屏幕截图的保存。

相机调用照片显示屏幕截屏与保存

1. 相机调用

1.1动态权限申请

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (getActivity().checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //权限没有被授予 requestPermissions(new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA); } else {//权限被授予 //拍照 } }

和之前对于定位的申请流程一样,先判断当前版本,若是6.0之后,继续判断当前是否得到权限,若未得到则通过requestPermission去申请。

@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { //对于系统相机申请的回调 if (requestCode == PERMISSION_REQUEST_CAMERA) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //权限被授予 } } else { // Permission Denied Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_SHORT).show(); } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }

##1.2 相机调用

//拍照 Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri photoUri = getMediaFileUri(TYPE_TAKE_PHOTO); takeIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); startActivityForResult(takeIntent, TAKE_PHOTO_CODE); //获取图片保存的文件地址和名称 public Uri getMediaFileUri(int type) { File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "梅特勒"); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { return null; } } //创建Media File String timeStamp = new SimpleDateFormat("yyyyMMdd-HH:mm:ss").format(new Date()); File mediaFile; if (type == TYPE_TAKE_PHOTO) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + longitude + "_" + latitude + "_" + timeStamp + ".jpg"); setMediaFile(mediaFile); } else { return null; } return Uri.fromFile(mediaFile); }

这里就比较容易理解了,通过intent进行拍照行为命令传递就好,同时需要创建图片文件对应的Uri,名称可以自己定义的。 之后正常的话应该出现你的手机的系统相机界面,同时可以拍照,拍完照就需要调用对应的回调函数进行处理了。

2.照片显示

@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Bitmap bm = null; // 外界的程序访问ContentProvider所提供数据 可以通过ContentResolver接口 ContentResolver resolver = getActivity().getContentResolver(); //对于拍照行为的回调 if (requestCode == TAKE_PHOTO_CODE) { if (resultCode == RESULT_OK) { if (data != null) { if (data.hasExtra("data")) { Log.i("URI", "data is not null"); Bitmap bitmap = data.getParcelableExtra("data"); imagePhoto.setImageBitmap(bitmap);//imageView即为当前页面需要展示照片的控件,可替换 } } else { Log.i("URI", "Data is null"); //获得拍照时候的左中右距离,文件名,拍照时间与经纬度坐标 File photoFile = getMediaFile(); String photoName = photoFile.getName(); String photoTime = photoName.split("_")[3].split("\\.")[0]; String photoLongitude = photoName.split("_")[1]; String photoLatitude = photoName.split("_")[2];*/ //将照片显示 Bitmap bitmap = BitmapFactory.decodeFile(getMediaFile().getPath()); imagePhoto.setImageBitmap(ThumbnailUtils.extractThumbnail(bitmap, 250, 200));//imageView即为当前页面需要展示照片的控件,可替换 } } } super.onActivityResult(requestCode, resultCode, data); }

(不知道为什么在Android6.0里面data拿回来一直是空的,经过测试和网上查找,基本都会跳到else执行)通过读取之前的MediaFile的路径信息拿到图片文件,然后通过缩略处理将照片显示(否则图片太大)

#3.屏幕截图 这里是项目的另一个需求,就是将手机当前的屏幕进行截屏并保存到指定路径。

同样这里需要动态申请权限,权限名为Manifest.permission.WRITE_EXTERNAL_STORAGE,首先判断有没有权限,没有通过requestPermission方法进行申请,这里就不做多描述了。

case R.id.txt_save_image_plane: try { saveToSD(myShot(getActivity()), "/storage/emulated/0/Pictures/梅特勒/", "plane-" + getTimeNow() + ".png"); Toast.makeText(getActivity(),"已保存当前信息于-/storage/emulated/0/Pictures/梅特勒/",Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } break; ... //当前屏幕截图0519 public Bitmap myShot(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; } //保存到手机SD卡,供分享0519 private void saveToSD(Bitmap bmp, String dirName, String fileName) throws IOException { // 判断sd卡是否存在 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { File dir = new File(dirName); // 判断文件夹是否存在,不存在则创建 if (!dir.exists()) { dir.mkdir(); } File file = new File(dirName + fileName); // 判断文件是否存在,不存在则创建 if (!file.exists()) { file.createNewFile(); } FileOutputStream fos = null; try { fos = new FileOutputStream(file); if (fos != null) { // 第一参数是图片格式,第二个是图片质量,第三个是输出流 bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); // 用完关闭 fos.flush(); fos.close(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

首先通过myshot方法获取当前的屏幕截图的bitmap。

然后直接通过saveToSD方法进行bitmap的指定路径保存:先进行文件夹和保存文件名的判断,不存在则创建,然后通过文件输出流的方式把指定的bitmap存入即可,之后便可以在手机指定目录看到当前屏幕的截图文件了

转载请注明原文地址: https://www.6miu.com/read-84238.html

最新回复(0)