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

版权声明:本文为博主原创文章,如需转载请同Joern私信联系。 https://blog.csdn.net/sdsh1880gm/article/details/77774054

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

  1. 相机调用
  2. 照片显示
  3. 屏幕截屏与保存

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存入即可,之后便可以在手机指定目录看到当前屏幕的截图文件了

猜你喜欢

转载自blog.csdn.net/sdsh1880gm/article/details/77774054