安卓调用系统相机录像并上传到后端服务器

  • 写在前面
    • 一、录像上传的思路
    • 二、添加相关权限
    • 三、按钮设置监听,调用相机录像并回调
      • 1、按钮设置监听:
      • 2、调用代码
      • 3、回调代码(划重点奥)
  • 最后的最后:

写在前面

  • 这段时间接了个安卓功能,把扔了很久的安卓又复习了一遍。其实就是个调用相机录像上传的功能。但是要注意的是系统自带的相机会出现几个无法避免的问题,那就是像素无法具体控制,可以简单调参数,如果对文件大小和像素没有特殊要求的,也可采用此方案,这里简单介绍一下

调用系统相机优点: 界面比较美观,功能相对完善。毕竟系统自带的相机。
调用系统相机缺点: 系统相机其实相当于一个已经封装好的工具,个性化的定义参数相对有限,比如无法自定义具体的分辨率,文件要么清晰粘内存,要么低至kb 画质糊成奥利给。

博主最后也是因为画质无法满足需求,最后放弃了调用系统相机。选择自定义相机,参数设置相对灵活。关于自定义相机我后面会在另一篇博客进行分享。

一、录像上传的思路

  • 1、调用系统相机录像,所以得获取摄像头和麦克疯的权限
  • 2、缓存到本地内存再进行上传,所以得获取
  • 3、通过okhttp以流的方式上传到后台

二、添加相关权限

    <!-- 授予该程序使用摄像头的权限 --><uses-permission android:name="android.permission.CAMERA"/><!-- 授予使用外部存储器的权限 --><permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 授予修改系统设置权限 --><uses-permission  android:name="android.permission.WRITE_SETTINGS" /><!-- 授予该程序使用麦克疯的权限 --><uses-permission android:name="android.permission.RECORD_AUDIO" />

三、按钮设置监听,调用相机录像并回调

1、按钮设置监听:


2、调用代码



public void startCamera(View view) {// 激活系统的照相机进行录像Intent captureImageCamera = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);//画质 高 1min 100M   低 1min 1.8M  不限制此参数 1min 15McaptureImageCamera.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, Constants.VideoQuality.HIGH);//允许记录的最长时间(以 秒 为单位) 例如:限制为30分钟captureImageCamera.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 30*60);//允许的最大大小(以 B 为单位) 例如:限制大小为500McaptureImageCamera.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024L * 1024 * 500);Uri fileUri = CommonCode.getOutputMediaFileUri(MEDIA_TYPE_VIDEO);captureImageCamera.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);                //指定要保存的位置。startActivityForResult(captureImageCamera, MainActivity.VIDEO_RECORD);}

关于MediaStore.EXTRA_VIDEO_QUALITY这个参数我要说两句,安卓开发文档里面只支持0和1两个参数。博主4800万像素的手机,画质 高 1min 100M 低 1min 1.8M 不限制此参数 1min 15M,大概就是这样子,同事小米11不限制1min就飙到了一百多M,是我的一百多倍。所以说虽然调用系统相机很简单,就上面几行代码就搞定了。但是存在的弊端也显而易见。这个应该是不同的手机按一定比例压缩的。出来的效果也不一样。


开发文档如下:可以看到其实就两个参数,而这两个参数一个高的离谱, 一个低到离谱,基本没法打到想要的效果。所以博主最后还是选择了自定义相机;文档传送门路径》》》:

》》英文的



》》中文的:



3、回调代码(划重点奥)

  • 继承Activity


  • 在onActivityResult下面写回调函数
 /*** 选择回调*/@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {//检验返回的code值是否是录像返回的,如果还有其他的code一定区分开来if(requestCode == MainActivity.VIDEO_RECORD_DEFAULT){uploadVideo(data);}}public boolean uploadVideo(Intent data){try {if(null == data || null == data.getStringExtra("url")){return false;}//这里回传的uri其实就是我们startCamera里面传过去的fileUri Uri uri = data.getData();path = uri.getPath();Log.d("返回文件路径:", path.substring(path.lastIndexOf("/") + 1));}catch (Exception e){e.printStackTrace();return false;}new Thread(new Runnable() {@Overridepublic void run() {//后台服务器接收视频的接口String url = CommonCode.getPortalUrl("/chatRecord/uploadFile");File file = new File(path);if (file.length()<1024*1024*800) {OkHttpClient client = new OkHttpClient();RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(),RequestBody.create(MediaType.parse("multipart/form-data"), file)).build();Request request = new Request.Builder().header("Authorization", "ClientID" + UUID.randomUUID()).url(url).post(requestBody).build();Response response = null;try {response = client.newCall(request).execute();String result = response.body().string();JSONObject jsonObject = JSONObject.parseObject(result);serverPath = jsonObject.getString("serverPath");} catch (IOException e) {e.printStackTrace();}if (!response.isSuccessful())try {throw new IOException("Unexpected code " + response);} catch (IOException e) {e.printStackTrace();}Message msg = Message.obtain();msg.what = 2;handler.sendMessage(msg);} else {String filenames = UUID.randomUUID().toString();byte[] inStream;//接受流的容量long streamTotal = 0;//流需要分开的数量int streamNum = 0;//文件剩下的字符数int leave = 0;  try {FileInputStream inputStream = new FileInputStream(file);streamTotal = inputStream.available();streamNum = (int)Math.floor(streamTotal/MAX_BYTE);leave = (int)streamTotal % MAX_BYTE;//文件的容量大于60Mb时进入循环if (streamNum > 0) {for (int i = 0; i < streamNum; ++i) {inStream = new byte[MAX_BYTE];inputStream.read(inStream,0,MAX_BYTE);//向后台传inStreamJSONObject param = new JSONObject();param.put("instream",inStream);String searchUrl = CommonCode.getPortalUrl("/chatRecord/uploadStream");JSONObject result = CommonCode.postGetJson(param, searchUrl);}}inStream = new byte[leave];JSONObject param = new JSONObject();param.put("instream",inStream);param.put("fileName", filenames);String searchUrl = CommonCode.getPortalUrl("/chatRecord/uploadStream");JSONObject result = CommonCode.postGetJson(param, searchUrl);inputStream.close();serverPath = filenames +".mp4";Message msg = Message.obtain();msg.what = 2;handler.sendMessage(msg);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}}).start();return true;}

关于一些用到的静态方法:


  • getPortalUrl 地址拼接
    public static String getPortalUrl(String portalname){String url = "http://" + imageServerIpPort + portalname;return url;}
  • 获取相机录像文件或者拍照的图片储存地址
 public static Uri getOutputMediaFileUri(int type){return Uri.fromFile(getOutputMediaFile(type));}public static File getOutputMediaFile(int type){File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyCameraApp");if (! mediaStorageDir.exists()){if (! mediaStorageDir.mkdirs()){Log.d("MyCameraApp", "failed to create directory");return null;}}String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());File mediaFile;if (type == MEDIA_TYPE_IMAGE){mediaFile = new File(mediaStorageDir.getPath() + File.separator +"IMG_"+ timeStamp + ".jpg");} else if(type == MEDIA_TYPE_VIDEO) {mediaFile = new File(mediaStorageDir.getPath() + File.separator +"VID_"+ timeStamp + ".mp4");} else {return null;}return mediaFile;}
  • getOutputMediaFileUri 获取文件URi
    public static Uri getOutputMediaFileUri(File file){return Uri.fromFile(file);}

最后的最后:

这里附上另一篇关于调用系统相机录像上传的文章,也是博主自己踩出来的:

  • 传送门.>>安卓自定义相机录像并上传(详细参数设置)

你以为还有么,没有了,以上便是调用相机录像并上传的所有过程。自定义相机录像后面博主找时间给补上吧,花了一周时间业余时间研究的,还是值得记录一下的。

以上便是所有内容,如有错误,还望指正!欢迎大家留言交流!

安卓调用系统相机录像并上传到后端服务器相关推荐

  1. 安卓自定义相机录像并上传(详细参数设置)

    安卓调用系统相机录像并上传到后端服务器 写在前面 一.录像上传的思路 二.添加相关权限 三.按钮设置监听,调用相机录像并回调 1.按钮设置监听: 2.调用代码 3.部分重要参数 4.回调上传视频到服务 ...

  2. 安卓调用系统相机进行拍照

    安卓调用系统相机进行拍照 调用系统相机进行拍照的话,步骤比较简单,分为两步 使用隐式Intent打开相机 在onActivityResult回调中对图片进行处理 (传回来的图片分为缩略图和原图,缩略图 ...

  3. 安卓调用系统相机拍照并返回,实现图片预览

    安卓调用相机拍照并返回预览及相关类型换(略缩图,画质糊)原图预览参考传送门 一.demo预览 二.xml代码和activity简单代码描述. 三.顺便写几个转换工具方法吧 今年主要在忙新项目,安卓也有 ...

  4. 摄像头网页服务器,js调用本地摄像头拍照并上传到web服务器

    [实例简介] js调用本地摄像头拍照并上传到web服务器.后台使用java实现图片的接收和存储,上传的图片默认保存到项目下的images文件夹中. [实例截图] [核心代码] MyCamera └── ...

  5. 安卓调用系统相机拍照并且显示在ImageView上

    并没有什么技术难点,只是在保存到sdCard的时候有一点小细节需要注意,所以写了这篇文章.代码很简单,就不解释什么了,直接贴上源码. public class TakePhotoActivity ex ...

  6. 调用系统相机录像,压缩保存到相册(附仿微信视频录制demo)

    使用系统相机录像,使用的AVFoundation框架.首先了解一下框架的使用. 一.录制的相关类有: 1.AVCaptureSession 媒体(音.视频)捕获会话,负责把捕获的音视频数据输出到输出设 ...

  7. uniapp webview 直接调用原生摄像头拍照 拍视频 img video,通过ajax获取blob(file为特殊的blob)对象并上传到后端服务器

    web-view中通过plus方法调用摄像头拍照或者拍视频并上传后端的操作步骤如下 plus.camera.getCamera()获取摄像头对象 cmr cmr.captureImage(callba ...

  8. 安卓调用系统相机三步走

    第一步: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> &l ...

  9. Android实现调用系统相机录像及实现录音

    录像实现原理特别简单,先在配置文件中声明一下权限,这个就不说了,然后直接使用Intent跳转就行. Intent intent = new Intent(MediaStore.ACTION_VIDEO ...

最新文章

  1. 万字长文,理解Elasticsearch和面试总结
  2. leetcode 2. 两数相加
  3. 拒绝亡羊补牢!SQL Server服务器安全防护!
  4. VueX(Vue状态管理模式)
  5. 是否是工作日和节假日判定
  6. 数据挖掘—K-中心点聚类算法(Java实现)
  7. emui内核支持kvm吗_KVM虚拟化详解
  8. Python中超类是如何知道自己被继承的
  9. 读书笔记之深入理解Java虚拟机
  10. 税控数据接口之XML接口导入
  11. 智头条:3月智能圈投融资大事记:极米、涂鸦上市,大华获中国移动56亿投资,凯迪仕获近1亿美元融资,小米投100亿美金造车
  12. 自动化测试框架Selenium的使用——安装Selenium
  13. MyBatis整合Spring的实现(16)
  14. 3D游戏建模学习有哪些书?自学难不难?能学成就业吗
  15. 电商中的订单号如何实现
  16. 华视电子读卡器100N,读取二代身份证信息
  17. iOS动手做一个直播app开发(代码篇)
  18. ITE Super IO入门篇
  19. Linux内核之vmlinux与vmlinuz
  20. (计算机网络)路由器数据包转发

热门文章

  1. RabbitMQ 修改默认端口
  2. 用xlsx-style设置表格的高度,宽度,颜色,字体等
  3. uni-app上传视频在手机上上传失败,在web端上传成功
  4. Gilde的详细使用
  5. Gilde获取Bitmap
  6. 暴笑魔兽公会聊天记录
  7. C++最经典塔防游戏代码,(高仿),完美复原原游戏,好玩到停不下来
  8. 如果黄光裕与刘强东联手对抗马云,什么结局?
  9. 泛微自带:考勤报表(考勤相关)
  10. 数字图像处理笔记(七):频域低通滤波平滑图像