android 拍照上传照片

2023-10-31

     废话不多说,直接进入主题,想要在android中实现拍照最简单饿方法就是New 一个 Intent 设置Action为android.media.action.IMAGE_CAPTURE 然后使用startActivityForResult(intent,REQUEST_CODE)方法进入相机。当然还有很多方式可以实现,大家可以在网上查找。但是要注意的是在进入相机前最好判断下sdcard是否可用,代码如下:
1                destoryBimap();
2 String state = Environment.getExternalStorageState();
3 if (state.equals(Environment.MEDIA_MOUNTED)) {
4     intent = new Intent("android.media.action.IMAGE_CAPTURE");
5     startActivityForResult(intent, REQUEST_CODE);
6 else {
7     Toast.makeText(DefectManagerActivity.this,
8             R.string.common_msg_nosdcard, Toast.LENGTH_LONG).show();
9 }
当拍照完成以后需要在onActivityResult(int requestCode, int resultCode, Intent data)方法中获取拍摄的图片,android把拍摄的图片封装到bundle中传递回来,但是根据不同的机器获得相片的方式不太一样,所以会出现某一种方式获取图片为null的想象,解决办法就是做一个判断,当一种方式不能获取,就是用另一种方式,下面是分别获取相片的两种方式:
01                Uri uri = data.getData();
02 if (uri != null) {
03     photo = BitmapFactory.decodeFile(uri.getPath());
04 }
05 if (photo == null) {
06     Bundle bundle = data.getExtras();
07     if (bundle != null) {
08         photo = (Bitmap) bundle.get("data");
09     else {
10         Toast.makeText(DefectManagerActivity.this,
11                 getString(R.string.common_msg_get_photo_failure),
12                 Toast.LENGTH_LONG).show();
13         return;
14     }
15 }

第一种方式是用方法中传回来的intent调用getData();方法获取数据的Uri,然后再根据uri获取数据的路径,然后根据路径封装成一个bitmap就行了.

第二种方式也是用法中传回来的intent对象但是不再是调用getData();方法而是调用getExtras();方法获取intent里面所有参数的一个对象集合bundle,然后是用bundle对象得到键为data的值也就是一个bitmap对象.

通过上面两种方式就能获取相片的bitmap对象,然后就可以在程序中是用,如果你想把相片保存到自己指定的目录可以是用如下步骤即可:

首先bitmap有个一compress(Bitmap.CompressFormat.JPEG, 100, baos)方法,这个方法有三个参数,第一个是指定将要保存的图片的格式,第二个是图片保存的质量,值是0-100,比如像PNG格式的图片这个参数你可以随便设置,因为PNG是无损的格式。第三个参数是你一个缓冲输出流ByteArrayOutputStream();,这个方法的作用就是把 bitmap的图片转换成jpge的格式放入输出流中,然后大家应该明白怎么操作了吧,下面是实例代码:

01           String pictureDir = "";
02 FileOutputStream fos = null;
03 BufferedOutputStream bos = null;
04 ByteArrayOutputStream baos = null;
05 try {
06     baos = new ByteArrayOutputStream();
07     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
08     byte[] byteArray = baos.toByteArray();
09     String saveDir = Environment.getExternalStorageDirectory()
10             "/temple";
11     File dir = new File(saveDir);
12     if (!dir.exists()) {
13         dir.mkdir();
14     }
15     File file = new File(saveDir, "temp.jpg");
16     file.delete();
17     if (!file.exists()) {
18         file.createNewFile();
19     }
20     fos = new FileOutputStream(file);
21     bos = new BufferedOutputStream(fos);
22     bos.write(byteArray);
23     pictureDir = file.getPath();
24 catch (Exception e) {
25     e.printStackTrace();
26 finally {
27     if (baos != null) {
28         try {
29             baos.close();
30         catch (Exception e) {
31             e.printStackTrace();
32         }
33     }
34     if (bos != null) {
35         try {
36             bos.close();
37         catch (Exception e) {
38             e.printStackTrace();
39         }
40     }
41     if (fos != null) {
42         try {
43             fos.close();
44         catch (Exception e) {
45             e.printStackTrace();
46         }
47     }
48 }
然后就是实现图片的上传功能,我这里是是用的apache的HttpClient里面的MultipartEntity实现文件上传具体代码如下:
01 /**
02      * 提交参数里有文件的数据
03      *
04      * @param url
05      *            服务器地址
06      * @param param
07      *            参数
08      * @return 服务器返回结果
09      * @throws Exception
10      */
11     public static String uploadSubmit(String url, Map<String, String> param,
12             File file) throws Exception {
13         HttpPost post = new HttpPost(url);
14  
15         MultipartEntity entity = new MultipartEntity();
16         if (param != null && !param.isEmpty()) {
17             for (Map.Entry<String, String> entry : param.entrySet()) {
18                 entity.addPart(entry.getKey(), new StringBody(entry.getValue()));
19             }
20         }
21         // 添加文件参数
22         if (file != null && file.exists()) {
23             entity.addPart("file"new FileBody(file));
24         }
25         post.setEntity(entity);
26         HttpResponse response = httpClient.execute(post);
27         int stateCode = response.getStatusLine().getStatusCode();
28         StringBuffer sb = new StringBuffer();
29         if (stateCode == HttpStatus.SC_OK) {
30             HttpEntity result = response.getEntity();
31             if (result != null) {
32                 InputStream is = result.getContent();
33                 BufferedReader br = new BufferedReader(
34                         new InputStreamReader(is));
35                 String tempLine;
36                 while ((tempLine = br.readLine()) != null) {
37                     sb.append(tempLine);
38                 }
39             }
40         }
41         post.abort();
42         return sb.toString();
43     }
这里就基本上对图片上传就差不多了,但是还有一个问题就是图片上传完以后bitmap还在内存中,而且大家都知道如果,高清的图片比较大,而手机内存本来就有限,如果不进行处理很容易报内存溢出,所以我们应该把处理完的bitmap从内存中释放掉,这时候就需要调用bitmap的recycle();方法,调用这个方法的时候需要注意不能太早也不能太晚,不然会报异常,一般可以放在下一张图片生成前或者没有任何view引用要销毁的图片的时候下面是实例代码:
1 /**
2      * 销毁图片文件
3      */
4     private void destoryBimap() {
5         if (photo != null && !photo.isRecycled()) {
6             photo.recycle();
7             photo = null;
8         }
9     }

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置:

  在AndroidManifest.xml中加入访问SDCard的权限如下:

  <!-- 在SDCard中创建与删除文件权限 -->

  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

 <!-- 往SDCard写入数据权限 -->

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


转自:http://blog.csdn.net/yaoyeyzq/article/details/7254679
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 拍照上传照片 的相关文章

随机推荐

  • python中的*,**与*args,**kwargs

    python中的 与 args kwargs 0 前言 1 用作算符运算符 2 用作打包运算符 2 1 用作函数形参 2 2 用作序列打包 3 用作解包运算法 3 1 用作函数实参 3 2 用作序列解包 4 打包和解包的混合使用 0 前言
  • 硅谷黑客增长

    1 增长黑客的90天计划 第一周 了解增长的工具箱 渠道管理系统 分析工具等 深入研究历史数据 发现问题 和领导 团队沟通 了解如何开展工作 合作 倾听用户的声音 看看评论 社交媒体留言 第一个月 确定增长指标 找到一个聚焦领域 摘取低垂的
  • react-router详解

    react router详解 react router详解 路由的基本使用 安装react router 使用react router 需求 导航区 头部一般组件 组件的使用 展示区 主体内容路由组件 路由组件与一般组件 NavLink与封
  • citespace快速上手教程(包括相关报错)

    文章目录 相关参考内容 一 启动citespace 注意 1 1点击startCitespace Windows bat 1 2弹出如下界面 输入数字2 1 3进行 操作后弹出如下界面 1 4citespace操作界面如下 二 citesp
  • Faster-RCNN

    每看一次都有新感觉 好文链接 https zhuanlan zhihu com p 32404424
  • VC调用matlab中定义的.m文件中的函数的实例

    matlab是一个强大的数学计算 仿真工具 其内置了很多实用的现成的函数
  • 西门子s7-200smart PLC通讯协议(TCP)

    西门子s7 200smart PLC通讯协议 TCP 由于网上找到的大部分指令解析资料都是以1200 300 等为主的指令 并未见到200smart系列 且恰巧项目需要与该plc通讯读写数据 虽然找到一些现有c 的工程代码不过对200sma
  • 杂牌平板mt6797_单核强劲但耐久不足的MT6797_平板电脑评测-中关村在线

    单核强劲但耐久不足的MT6797 笔者使用安兔兔v7 0 7和Geekbench 4对酷比魔方X1进行了跑分测试 结果如下 安兔兔测试 GeekBench 4测试 根据安兔兔和GeekBench 4测试 MT6797性能尚可一战 尤其是在G
  • 【论文精度】MAE逐段精读

    跟李沐学AI的b站视频视频 论文精读笔记第四期 包含MAE论文精读第一遍和论文精读第二遍
  • 01背包问题中两个背包的解法

    问题描述大致如下 给你n个物品 两个背包 如何装包可以使得两个背包得到的价值是最大的 一个简化问题 来自微软的笔试题 题目大意 有两条生产线 一条可以工作x小时 一条工作y小时 一个数组表示每种汽车生产需要多久 要求最多生产多少种汽车 解析
  • 《Python进阶系列》十二:最全魔术方法整理

    Python中的魔术方法 所谓魔法函数 Magic Methods 是Python的一种高级语法 允许你在类中自定义函数 并绑定到类的特殊方法中 比如在类A中自定义 str 函数 则在调用str A 时 会自动调用 str 函数 并返回相应
  • Java继承(超详解)

    目录 1 继承 1 1 继承概述 1 2 继承的优缺点 1 3 继承中变量的访问特点 1 4 super 1 5 继承中构造方法的访问特点 1 6 继承中成员方法的访问特点 1 7 方法重写 1 8 方法重写的注意事项 1 9 java中继
  • 2021年南京大学842考研-软件工程部分简答题

    1 抽象和分解的关系 抽象和分解是软件设计的核心思想 分解是横向将系统分解为几个相对简单的子系统以及各子系统之间的关系 分解之后每次只需关注经过分解的相对简单的子系统及其相互间的关系 从而降低了复杂度 抽象则是在纵向上聚焦各自系统的接口 抽
  • MyBatis简介

    1 什么是 MyBatis MyBatis 是一款优秀的持久层框架 它支持自定义 SQL 存储过程以及高级映射 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作 MyBatis 可以通过简单的 XML 或注解来
  • c++ std::string截取子串

    std vector
  • 上传文件请求绕过网关

    一 问题描述 1 本例中 我需要请求上传文件微服务的接口 并且绕过Zuul网关 因为请求会携带图片 如果再通过网关的话 会非常浪费资源 2 图片上传是文件的传输 如果也经过Zuul网关的代理 文件就会经过多次网路传输 造成不必要的网络负担
  • 【附源码】计算机毕业设计Python安卓Android的问卷调查管理系统9q4d4(源码+程序+LW+调试部署)

    附源码 计算机毕业设计Python安卓Android的问卷调查管理系统9q4d4 源码 程序 LW 调试部署 该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行环境配置 Python3 7 7 Django Mysql
  • 【有限元分析】有限元仿真分析与解析解的结果对比——以阶梯轴的静力分析为例

    1 对一个阶梯轴零件进行基于材料力学的理论计算 求解最大应力值 2 在WORKBENCH中对该阶梯轴零件进行有限元仿真 实行两种仿真方案 分别是1 梁模型建模 梁单元网格划分 2 实体模型建模 六面体单元网格划分 观察两种仿真结果并与理论计
  • Flask导入配置文件

    为什么要导入配置文件呢 我刚开始学习Flask的时候 觉得没这必要 所以直接忽略了 后来 app的配置越来越多 并且不同的py文件里的配置有重复 所以需要另外写一个配置文件 方便管理 官方文档上说的有3种方法 app config from
  • android 拍照上传照片

    废话不多说 直接进入主题 想要在android中实现拍照最简单饿方法就是New 一个 Intent 设置Action为android media action IMAGE CAPTURE 然后使用startActivityForResult