这一部分我们将探讨对于Android手机相机的调用以及当前屏幕截图的保存。
相机调用照片显示屏幕截屏与保存和之前对于定位的申请流程一样,先判断当前版本,若是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,名称可以自己定义的。 之后正常的话应该出现你的手机的系统相机界面,同时可以拍照,拍完照就需要调用对应的回调函数进行处理了。
(不知道为什么在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存入即可,之后便可以在手机指定目录看到当前屏幕的截图文件了
