• 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中实现即可。

  • 相关阅读:
    js父窗体关闭,子窗体紧随
    jquery validate 详细说明
    MyEclipse使用汇总——MyEclipse10设备SVN插入
    与策略模式工厂工作方式之间的差
    我必须发展2048配置界面设计
    Openstack部署总结:“部署过程Error: Local ip for ovs agent must be set when tunneling is enabled”问题
    国家模式c++
    Python 产生两个方法将不被所述多个随机数的特定范围内反复
    [React] Normalize Events with Reacts Synthetic Event System
    [NPM] Pipe data from one npm script to another
  • 原文地址:https://www.cnblogs.com/android-host/p/5310873.html
Copyright © 2020-2023  润新知