• android 使用相机拍照,并存储到手机sd卡上,并利用系统录像录像并播放


    //首先声明一个成员变量 String savePath,用来储存文件路径
        /**
         * 保存照片路径
         * @return 返回图片的一个文件
         * @throws IOException 抛出一个异常
         */
        private File createSavePath() throws IOException{
            String saveFormat = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String imageFileName = "JPEG_" + saveFormat + "_";
            File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
            File image = File.createTempFile(imageFileName,".jpg",storageDir);
            savePath = image.getAbsolutePath();
            //将照片添加到相册中以便其他应用查看
            galleryAddPic();
            return  image;
        }
     /**
         * 将照片添加到相册中
         */
        private void galleryAddPic() {
            Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            File f = new File(savePath);
            Uri contentUri = Uri.fromFile(f);
            intent.setData(contentUri);
            this.sendBroadcast(intent);
        }
     /**
         * 解码一幅缩放图片,放到imageview中
         */
        private void setPic() {
            // 得到imgeView这个控件的尺寸
            int targetW = imageView.getWidth();
            int targetH = imageView.getHeight();
    
            // 得到这个位图的尺寸
            BitmapFactory.Options bmOptions = new BitmapFactory.Options();
            bmOptions.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(savePath, bmOptions);
            int photoW = bmOptions.outWidth;
            int photoH = bmOptions.outHeight;
            // 确定图片的缩减比例
            int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
    
            // 解码图像文件到一个位图的大小来填充视图
            bmOptions.inJustDecodeBounds = false;
            bmOptions.inSampleSize = scaleFactor - 1;//这里我用的减1 ,因为在运行过程中程Bitmap too large to be uploaded into a texture (3120x4160, max=4096x4096) 就只能相对减少一个比例
            bmOptions.inPurgeable = true;
    
            Bitmap bitmap = BitmapFactory.decodeFile(savePath, bmOptions);
            imageView.setImageBitmap(bitmap);
        }

    最后调用,启动相机拍照

    private void startActivity(){
            //启动相机并给新照片创建文件对象
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            //在调用activity的时候首先调用resolveActivity(),判断调用的activity有没有执行这个的能力
            if (intent.resolveActivity(getPackageManager()) != null) {
                File file = null;
                try {
                    file = createSavePath();
                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),"IO异常错误!",Toast.LENGTH_LONG).show();
                }
                if (file != null){
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
                    startActivityForResult(intent,REQUESTCODE);
                }
            }
        }

    最后一步,在相机返回的时候用解码的位图显示到imageview中

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            //首先判断返回是否成功
            if (requestCode == REQUESTCODE && resultCode == RESULTCODE){
                //解码图片放到imageview中
                  setPic();
            }
        }

    简单的拍照就完成了。

    录像并播放

    跳转到录像:

    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
                    if (intent.resolveActivity(getPackageManager()) != null){
                        startActivityForResult(intent,REQUESTCODE_VIDEO);
                    }

    和拍照类似

    if (requestCode == REQUESTCODE_VIDEO && resultCode == RESULTCODE){
                    //得到录制视频的uri
                    Uri uri = data.getData();
                    imageView.setVisibility(View.GONE);
                    videoView.setVisibility(View.VISIBLE);
                    //将uri设置到videoview中
                    videoView.setVideoURI(uri);
                    //实例化一个控制
                    mediaco = new MediaController(TakePicture.this);
                    videoView.setMediaController(mediaco);
                    mediaco.setMediaPlayer(videoView);
                    videoView.requestFocus();
            }

    在onActivityResult中实现即可。

  • 相关阅读:
    requirejs学习笔记
    Java日期时间处理
    Linux安装ftp服务
    软考真题之设计模式
    《Microsoft Visio 2013 Step by Step.pdf》
    《C++实践之路.pdf》源码
    Python基础与进阶
    微信小程序实战[01]
    常用资源网站
    ECLIPS-S测井系统下的仪器挂接 [CV模块]
  • 原文地址:https://www.cnblogs.com/android-host/p/5310873.html
Copyright © 2020-2023  润新知