IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 11 拍照+录制视频保存到外部共享区域 -> 正文阅读

[移动开发]Android 11 拍照+录制视频保存到外部共享区域

本文是?Android 11 从外部存储读取文件到应用沙盒存储? 和?Android 11 从沙盒拷贝文件到外部共享存储区域?实践篇。

?项目中我们有拍摄图片或者录制视频保存到外部共享存储区域的需求。

Android 10之前,我们可以直接new File的形式访问外部存储区域的任意路径。

Android 10后,Google推出了沙盒机制,应用通过new File形式访问只能访问自己沙盒下路径;可以通过ContentResolver访问外部共享存储区域。

外部共享存储区域:主要是指Enviromnent下的 如

? ? Environment.DIRECTORY_DCIM
? ? Environment.DIRECTORY_DOCUMENTS
? ? Environment.DIRECTORY_DOWNLOADS
? ? Environment.DIRECTORY_MOVIES
? ? Environment.DIRECTORY_PICTURES
? ? Environment.DIRECTORY_MUSIC

等。
?

本文是关于调用系统拍照+录制视频并且保存到外部共享存储区域的demo,效果:

核心实现:?

?1. 调用系统拍照和录制视频的方法requestWriteImage()和requestWriteVideo()

?2. 拍照和录制视频保存到外部共享存储,android Q以上 需要通过ContentResolver获取uri :getImageUriAboveQ()和getVideoUriAboveQ()

public void requestWriteImage() {
        Intent intent = new Intent();
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        Uri mediaUri = null;
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            mediaUri = getImgeUriAboveQ(mFragment.getActivity(), "Image_" + System.currentTimeMillis());
        } else {
            File dicmFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
            File mediaFile = new File(dicmFile.getAbsoluteFile() + "Image_" +  System.currentTimeMillis() +".jpg");
            mediaUri = Uri.fromFile(mediaFile);
        }
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mediaUri);
        mFragment.startActivityForResult(intent, REQUEST_CODE_WRITE_IMAGE);
    }

    public void requestWriteVideo() {
        Intent intent = new Intent();
        intent.setAction("android.media.action.VIDEO_CAPTURE");
        intent.addCategory("android.intent.category.DEFAULT");
        Uri mediaUri = null;
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            mediaUri = getVideoUriAboveQ(mFragment.getActivity(), "Video_" + System.currentTimeMillis());
        } else {
            File dicmFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
            File mediaFile = new File(dicmFile.getAbsoluteFile() + "Video_" +  System.currentTimeMillis() +".mp4");
            mediaUri = Uri.fromFile(mediaFile);
        }
        intent.putExtra(MediaStore.EXTRA_OUTPUT, mediaUri);
        mFragment.startActivityForResult(intent, REQUEST_CODE_WRITE_VIDEO);
    }

    private Uri getImgeUriAboveQ(Context context, String imageName) {
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            return null;
        }
        Uri imageUri = null;
        ContentResolver resolver = context.getContentResolver();
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.DISPLAY_NAME, imageName);//图片名
        values.put(MediaStore.Images.Media.DESCRIPTION, imageName); //描述
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");//类型
        values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM);//保存路径
        Uri externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        imageUri = resolver.insert(externalUri, values);
        return imageUri;
    }

    private Uri getVideoUriAboveQ(Context context, String videoName) {
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            return null;
        }
        Uri videoUri = null;
        ContentResolver resolver = context.getContentResolver();
        ContentValues values = new ContentValues();
        values.put(MediaStore.Video.Media.DISPLAY_NAME, videoName);//视频名
        values.put(MediaStore.Video.Media.DESCRIPTION, videoName); //描述
        values.put(MediaStore.Images.Media.MIME_TYPE, "video/mp4");//类型
        values.put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_DCIM);//保存路径
        Uri externalUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        videoUri = resolver.insert(externalUri, values);
        return videoUri;
    }

3. 弹BottomSheetDialog调用requestWriteImage()和requestWriteVideo()

 public void showBottomSheetDialog() {
        bottomSheetDialog = new BottomSheetDialog(mFragment.getActivity());
        View dialogView= LayoutInflater.from(mFragment.getActivity())
                .inflate(R.layout.layout_bottom_sheet_image_video, null);
        TextView pictureTv= (TextView) dialogView.findViewById(R.id.picture_tv);
        TextView videoTv= (TextView) dialogView.findViewById(R.id.video_tv);
        TextView cancelTv= (TextView) dialogView.findViewById(R.id.cancel_tv);
        pictureTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                requestWriteImage();
                bottomSheetDialog.dismiss();
            }
        });
        videoTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                requestWriteVideo();
                bottomSheetDialog.dismiss();
            }
        });

        cancelTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                bottomSheetDialog.dismiss();
            }
        });

        bottomSheetDialog.setContentView(dialogView);
        bottomSheetDialog.show();
    }

Demo地址:

CODING | 一站式软件研发管理平台

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:26:00  更:2021-11-29 16:27:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:40:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码