在android开发中,调用相机的功能的频幕可谓相当之高,尤其在当前社交应用五花八门的情况下,相机的功能被开发的相当丰富,如美颜相机,美拍,微拍和最早的360相机等,可是制造多少“美女”,咳咳。好了,言归正传,今天咱们先学基本的应用。
首先,来几张demo演示图,

下面直接上代码,首先在Maintivity中,如下:

package com.example.android_camera.activity;import java.io.File;
import java.util.Calendar;
import java.util.Locale;import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;import com.example.android_camera.R;
import com.example.android_camera.util.StorePhotos;/*** * @author kk  调用系统相机拍摄,压缩后显示(防止图片过大加载中报OOM),并被保存到本地**/public class MainActivity extends Activity {private ImageView imageview;private Button BtnPlay;private Button Btn_look;private String fileName="";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initview();Linstener();}private void Linstener() {// TODO Auto-generated method stubBtnPlay.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {fileName=getPhotopath();Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); File out = new File(fileName);  Uri uri = Uri.fromFile(out);  // 获取拍照后未压缩的原图片,并保存在uri路径中  intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  startActivityForResult(intent, 0);}});Btn_look.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent=new Intent(MainActivity.this,PictureListActivity.class);startActivity(intent);}});}private String getPhotopath() {// TODO Auto-generated method stubDateFormat df = new DateFormat();String name = df.format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA))+ ".png";String fileName = "/sdcard/kkImage/" + name;File file = new File("/sdcard/kkImage/");if(!file.exists()){Log.e("TAG","第一次创建文件夹");file.mkdirs();// 如果文件夹不存在,则创建文件夹  }return fileName;}private void initview() {// TODO Auto-generated method stubimageview=(ImageView) findViewById(R.id.ImageView);BtnPlay=(Button) findViewById(R.id.BtnPlay);Btn_look=(Button) findViewById(R.id.Btn_look);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubif(requestCode==0){super.onActivityResult(requestCode, resultCode, data);Bitmap bitmap = getSmallBitmap(fileName);//这里是先压缩质量,再调用存储方法new StorePhotos(bitmap, fileName);imageview.setImageBitmap(bitmap);}else{Toast.makeText(this,"未拍摄照片!", Toast.LENGTH_SHORT).show();}}// 根据路径获得图片并压缩,返回bitmap用于显示public static Bitmap getSmallBitmap(String filePath) {final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;//设置为ture,只读取图片的大小,不把它加载到内存中去BitmapFactory.decodeFile(filePath, options);// Calculate inSampleSizeoptions.inSampleSize = calculateInSampleSize(options, 480, 800);//此处,选取了480x800分辨率的照片// Decode bitmap with inSampleSize setoptions.inJustDecodeBounds = false;//处理完后,同时需要记得设置为falsereturn BitmapFactory.decodeFile(filePath, options);}//计算图片的缩放值public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {final int height = options.outHeight;final int width = options.outWidth;int inSampleSize = 1;if (height > reqHeight || width > reqWidth) {final int heightRatio = Math.round((float) height/ (float) reqHeight);final int widthRatio = Math.round((float) width / (float) reqWidth);inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;}return inSampleSize;}
}

布局文件为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.android_camera.activity.MainActivity" ><ImageView
        android:layout_weight="9"android:id="@+id/ImageView"android:layout_width="match_parent"android:layout_height="0dp"android:scaleType="fitXY"android:src="@drawable/carema_bg"android:padding="5dp"android:background="@android:color/white"/><LinearLayout android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"android:padding="5dp"><Button
        android:id="@+id/BtnPlay"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:text="@string/BtnPlay"android:background="@drawable/btn_submit"/><Button
        android:id="@+id/Btn_look"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:text="@string/Btn_look"android:background="@drawable/btn_submit2"android:layout_marginLeft="4dp"/></LinearLayout>
</LinearLayout>

从MainActivity中可以看出,当回调显示时,需要对图片进行压缩,然后再保存,用StorePhotos类如下:

package com.example.android_camera.util;import java.io.File;
import java.util.ArrayList;
import java.util.List;import android.content.Context;
import android.os.Environment;
import android.util.Log;/*** * @author kk   获取SD卡中的图片路径,图片处理类**/public class GetImagesPath {private Context mcontext;private static File[] files;private static List<String> pathList=new ArrayList<String>();public GetImagesPath(Context context) {this.mcontext=context;}public static List<String> Get(){//获得保存图片的文件夹File file=new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/kkImage");//先判断是否为文件夹,以免后续操作出错if (file.isDirectory()) {files = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/kkImage").listFiles();for (File filepath : files) {String path=filepath.getAbsolutePath();Log.e("TAG","图片的路径为:"+path);pathList.add(path);}return pathList;}return null;}}

此时,当点击查看所有保存在本地的图片时,首先需要遍历图片所保存的文件夹,我这里保存的文件夹是“/sdcard/kkImage/“下,取到图片的所有路径(最好是绝对路径),然后用ListView把图片用列表的形式展示出来,那么重点来了,这么多图片的显示加载,极有可能发生OOM,因此需要对图片的加载进行相应的处理,相应代码如下:

1.获取图片路径代码

package com.example.android_camera.util;import java.io.File;
import java.util.ArrayList;
import java.util.List;import android.content.Context;
import android.os.Environment;
import android.util.Log;/*** * @author kk   获取SD卡中的图片路径,图片处理类**/public class GetImagesPath {private Context mcontext;private static File[] files;private static List<String> pathList=new ArrayList<String>();public GetImagesPath(Context context) {this.mcontext=context;}public static List<String> Get(){//获得保存图片的文件夹File file=new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/kkImage");//先判断是否为文件夹,以免后续操作出错if (file.isDirectory()) {files = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/kkImage").listFiles();for (File filepath : files) {String path=filepath.getAbsolutePath();Log.e("TAG","图片的路径为:"+path);pathList.add(path);}return pathList;}return null;}}

2.弹窗展示具体图片信息dialog

package com.example.android.dialog;import com.example.android_camera.R;import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.Display;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;public class LargeImageDialog extends Dialog {private Context mcontext;private String path;private Bitmap bm;private ImageView dialog_img;private TextView dialog_text;public LargeImageDialog(Context context,String path,Bitmap bitmap) {super(context);this.mcontext=context;this.path=path;this.bm=bitmap;}@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);this.setContentView(R.layout.img_dialog);bindView();init();}private void bindView() {// TODO Auto-generated method stubdialog_img=(ImageView) findViewById(R.id.dialog_img);dialog_text=(TextView) findViewById(R.id.dialog_text);Window dialogWindow=getWindow();WindowManager m =dialogWindow.getWindowManager();Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用WindowManager.LayoutParams lp=dialogWindow.getAttributes();lp.width=(int) (d.getWidth()*0.9);//设置为屏幕宽度的0.9lp.height=(int) (d.getHeight()*0.9);//设置为屏幕高度的0.9dialogWindow.setAttributes(lp);}private void init() {dialog_img.setImageBitmap(bm);dialog_text.setText("图片存储路径为:"+path);}}

此时,一个相机拍照,压缩存储,列表查看,详细信息的小demo就已经呼之欲出了,我这里只是把一些相关的代码列出来,在下面我会把Demo的下载链接添加上,供朋友们参考,不足的地方还请留言指正 0.0

噢,还有个重要又常被忘记的一点,记得添加相应的权限:

 <!-- 在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><!-- 往SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 读取SDCard中的数据权限 --><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" />

好了,everything is ok!

demo下载地址:http://download.csdn.net/detail/myname_kk/9324997

完美调用系统相机拍照,获取图片进行压缩并本地保存相关推荐

  1. android 调用系统相机拍照 获取原图

    博客源址:android 调用系统相机拍照 获取原图 博客时间:2013-04-23 11:08 好吧,为了这个问题又折腾了一整天.之前在网上找来的方法,如果在onActivityResult中直接用 ...

  2. 解决三星调用系统相机拍照显示图片旋转90度横着的问题

    最近项目有个功能是调用系统相机拍照上传图片的功能,发现别的手机都没有ok,只有三星的显示图片很明显是旋转了90度,横着的.后来百度了解是三星对android相机单独做了优化(android碎片化,各种 ...

  3. android 三星手机拍照旋转90度,解决三星调用系统相机拍照显示图片旋转90度横着的问题...

    /** * 调用系统相机拍照工具类 * @author yao * */ public class CaremaUtil { private static String strImgPath = &q ...

  4. android调用系统相机并获取图片

    如果不是特别的要求,通过拍照的方式取得图片的话,我们一般调用系统的拍照来完成这项工作,而没必要再自己去实现一个拍照功能.调用系统相机很简单,只需要一个intent就可以跳转到相几界面,然后再通过onA ...

  5. android 相机拍照返回,Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题...

    版权声明:本文为博主原创文章,未经博主允许不得转载. 正常情况下调用系统相机拍照: 如果拍照后点击的是"确定"图标,返回的resultCode = -1(Activity.RESU ...

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

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

  7. Android7.0调用系统相机拍照、访问相册问题。

    关于Android7.0调用系统相机拍照.访问相册的一些问题: 在Android6.0中Google提出了动态申请权限的Api,调用相机拍照,访问SDcard等操作都需要先申请对应的权限如下: < ...

  8. Android多层嵌套Fragment中调用系统相机拍照以及裁剪的相关问题解决

    多层嵌套Fragment中调用系统相机拍照.裁剪 最近公司项目有频繁使用相机拍照的需求,然后频繁的实际使用过程中遇到很多大大小小的坑,在此记录下. (ps.关于一些拍照后图片旋转.裁剪设置返回数据为t ...

  9. android拍照保存到系统相册,调用系统相机拍照,并且保存到系统相册的一般套路...

    最近遇到也一个需求:调用系统相机拍照,并且照片可以在系统相册显示. 关于照片显示在系统相册这个问题,因为安卓机型太多了,各大厂商都对原生系统进行了不同程度的定制,所以在一般情况下,有的手机会把图片直接 ...

最新文章

  1. python入门需要多久-怎么自学python,大概要多久?
  2. Makefile —— 如何在文件内使用变量?
  3. C#Socket编程详解(一)TCP与UDP简介
  4. 关于leetcode第K个最大元素的几种解法
  5. GitLab修改用户密码
  6. SAP Spartacus 单元测试开发规范
  7. 状态机思路在嵌入式开发中的应用详解
  8. Mac OS使用技巧之三:发射无线网络信号的方法
  9. Mac/Linux系统连接远端服务器以及相同IP地址的服务器账号密码重置,ssh失败问题
  10. 【数论】—— 整数质因子分解
  11. 关于项目404解决方法:前提条件:项目路径都是正确的
  12. 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!...
  13. 已知二叉树的后序和中序遍历结果 求前序结果
  14. linux桌面共享编程,Remmina:一个Linux下功能丰富的远程桌面共享工具
  15. Java使用iTextPDF生成PDF文件
  16. [ffmpeg] 视频码率压缩
  17. 不属于计算机系统的输出设备,不是电脑的输出设备的是什么
  18. VBA教程初级(五):复杂数组
  19. 内存泄露(memery leak)避免方法
  20. 基于FPGA实现的数字位同步锁相环设计

热门文章

  1. 嘉应大学黄林鑫计算机学院,我校学子喜获多项计算机类国内、国际赛事奖项
  2. 批量修改文本添加字符批处理
  3. Java使用POI操作Excel文件
  4. Java 库文件的添加教程
  5. 如何去掉微信小程序的自带头部,自定义创建?
  6. Android中关于notifyDataSetChanged()方法的注意
  7. VMware虚拟机安装镜像时黑屏,亲测有效!
  8. “右键点文件电脑假死机”处理方法
  9. sublime插件安装,配色方案
  10. 【新手必读】微擎nbsp;微赞等系统…