Android系统相册拍照调用

记录一下api的使用。

拍照

步骤:

  1. 添加权限

    	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.CAMERA" />
        <!--可能还要其他权限如写,麦克风-->
    
  2. 动态申请

     private void goTackPhoto() {
            String[] permissions = {Manifest.permission.CAMERA};
            if (!PermissionUtil.hasPermissions(this, permissions)) {
                requestPermission(permissions, PermissionUtil.STORY_REQUEST_CODE);
            } else {
                taskPhoto();
            }
        }
    
    
     private void requestPermission(String[] permissions, int code) {
            if (!PermissionUtil.hasPermissions(this, permissions)) {
                if (PermissionUtil.shouldShowRequestPage(this, permissions)) {
                    Uri packageURI = Uri.parse("package:" + this.getPackageName());
                    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                    startActivity(intent);
                } else {
                    ActivityCompat.requestPermissions(this, permissions, code);
                }
            } else {
                ActivityCompat.requestPermissions(this, permissions, PermissionUtil.STORY_REQUEST_CODE);
            }
        }
    
    //申请后的回调
     @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            switch (requestCode) {
                case PermissionUtil.STORY_REQUEST_CODE:
                    if (grantResults.length > 0) {
                        if (!PermissionUtil.hasAllPermission(grantResults)) {
                            //TODO
                        } else {
                            taskPhoto();
                        }
                    }
                    break;
            	default:
                    break;
            }
        }
    
  3. 调用

    private void taskPhoto() {
            File outputImage = new File(Environment.getExternalStorageState(), System.nanoTime() + IMAGE_SUFFIX);
            try {
                if (outputImage.exists()) {
                    outputImage.delete();
                }
                outputImage.createNewFile();
            } catch (IOException e) {
                Log.e(TAG, "taskPhoto: " + e.toString());
            }
        //添加这3行后可以调用摄像头,但是不懂什么原理
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
            builder.detectFileUriExposure();
    
            mImageUri = Uri.fromFile(outputImage);//这个 Uri 对象标识着 output_image.jpg 这张图片的唯一地址
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);//指定图片的输出地址
            startActivityForResult(intent, TAKE_PHOTO); // 启动相机程序
        }
    
  4. 拍照后的回调处理

    @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            MediaBean.MediaType mediaType = MediaBean.MediaType.IMAGE;//自定义的javabean
            if (resultCode == RESULT_OK) {
                switch (requestCode) {
                    case TAKE_PHOTO:
                        Log.d(TAG, "老的获取到选择的图片=" + mFileUri);
                        if (data != null) {
                            mFileUri = data.getData();
                            Log.d(TAG, "修改获取到选择的图片=" + mFileUri);
                        }
                        if (mCloseBinder != null) {
                            mCloseBinder.close();
                        }
                        Intent intent = new Intent(MainActivity.this, CloseService.class);
                        stopService(intent);
                        mShouldDeleteImage = false;
                        break;
                    case TACK_VIDEO:
                        if (data != null) {
                            mFileUri = data.getData();
                            mediaType = MediaBean.MediaType.VIDEO;
                            Log.d(TAG, "获取到选择的视频=" + mFileUri);//???
                        }
                        break;
                    case SELECT_PIC:
                        if (data != null) {
                            mFileUri = data.getData();
                            if (!isImageType(mFileUri)) {
                                mediaType = MediaBean.MediaType.VIDEO;
                            }
                            Log.d(TAG, "获取到选择的图片2=" + mFileUri);
                        }
                        break;
                    case SELECT_VIDEO:
                        if (data != null) {
                            mFileUri = data.getData();
                            mediaType = MediaBean.MediaType.VIDEO;
                            Log.d(TAG, "获取到选择的视屏2=" + mFileUri);
                        }
                        break;
                    default:
                        break;
                }
            } 
        }
    

拍视频

步骤:

  1. 权限申请

  2. 调用

    private void takeVideo() {
        File outputVideo = new File(Environment.getExternalStorageState(), System.nanoTime() + VIDEO_SUFFIX);
        mFileUri = getMediaFileUri(outputVideo);
        Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 30);
        intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
        startActivityForResult(intent, TACK_VIDEO);
    }
    
  3. 回调接收

     @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case TAKE_PHOTO:
                    if (data != null) {
                        mFileUri = data.getData();
                        Log.d(TAG, "获取到选择的视频=" + mFileUri);//???
                    } break;
                }
            default:break;
            }
        }
    
    

调用相册选择

步骤:

  1. 申请读取权限

  2. 使用

    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, SELECT_PIC);
    
  3. 回调


调用视频选择

​ 步骤1、3同上。

private void selectVideo() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("video/*");
    startActivityForResult(intent, SELECT_VIDEO);
}

获取视频第一帧

private Bitmap getVideoThumb() {
        Bitmap bm;
        MediaMetadataRetriever media = new MediaMetadataRetriever();
        //mFileUri为视频文件的uri
        media.setDataSource(MainActivity.this, mFileUri);
        bm = media.getFrameAtTime();
        return bm;
    }
   // setDataSource()有多个重载方法,调用setDataSource(String path)可能会出问题,不同的机型在调用不同的方法也可能会出问题。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值