• android 拍照上传照片


    废话不多说,直接进入主题,想要在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     }

    转自:http://blog.csdn.net/yaoyeyzq/article/details/7254679

  • 相关阅读:
    rails时间问题
    stringify_keys 和symbolize_keys
    thritf
    Nginx负载均衡反向代理
    CentOS 7 yum 安装 Nginx
    CentOS 7安装与配置Tomcat8
    CentOS 7安装与配置JDK8
    系统数据字典模块设计
    mysql视图
    阿里云maven中央仓库
  • 原文地址:https://www.cnblogs.com/zhwl/p/2397886.html
Copyright © 2020-2023  润新知