在Android应用经常碰到需要调用相机拍照并保存的情况,这里笔者写了一个小小的Demo。

首先,在AndroidManifest.xml清单文件中声明权限:



  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
  2. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
  3. <uses-permission android:name="android.permission.CAMERA"/>  

布局文件:activity_main.xml

    


接下来上代码:

package com.example.testcamera;import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activity;import android.content.Intent;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;/** *  * @description 拍照Demo * @author xiong_it */public class MainActivity extends Activity {private static final String TAG = "MainActivity";private Button cameraButton;//照相按钮private ImageView photoImageView;//显示相片private static final int REQUEST_CODE = 1;private String strImgPath = "";//照片保存路径private File imageFile = null;//照片文件/** 定义相片的最大尺寸 **/private final int IMAGE_MAX_WIDTH = 540;private final int IMAGE_MAX_HEIGHT = 960;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iniView();cameraButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent getPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);strImgPath = Environment.getExternalStorageDirectory().toString() + "/Xiong_PIC/";String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg";// 照片以格式化日期方式命名File out = new File(strImgPath);if (!out.exists()) {out.mkdirs();}out = new File(strImgPath, fileName);strImgPath = strImgPath + fileName;// 该照片的绝对路径Uri uri = Uri.fromFile(out);getPhoto.putExtra(MediaStore.EXTRA_OUTPUT, uri);//根据uri保存照片getPhoto.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);//保存照片的质量startActivityForResult(getPhoto, REQUEST_CODE);//启动相机拍照}});}/** * 视图初始化 */private void iniView() {cameraButton = (Button) findViewById(R.id.take_photo);photoImageView = (ImageView) findViewById(R.id.photo_view);}/** * 返回照片结果处理 */@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {imageFile = new File(strImgPath);int scale = 0;scale = getZoomScale(imageFile);//得到缩放倍数Log.i(TAG, "scale = "+scale);BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = scale;photoImageView.setImageBitmap(BitmapFactory.decodeFile(strImgPath,options));//按指定options显示图片防止OOM}else {Toast.makeText(MainActivity.this, R.string.failed, Toast.LENGTH_LONG).show();}}/** * 图片缩放处理 * @param imageFile 照片文件 * @return 缩放的倍数 */private int getZoomScale(File imageFile) {int scale = 1;BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFile(strImgPath, options);while (options.outWidth / scale >= IMAGE_MAX_WIDTH|| options.outHeight / scale >= IMAGE_MAX_HEIGHT) {scale *= 2;}return scale;}}

源码下载: http://download.csdn.net/detail/xiong_it/8353941

转载时请保留链接:http://blog.csdn.net/xiong_it/article/details/42643835,谢谢!


更多相关文章

  1. uses-permission android:name="android.permission.INSTALL_PAC
  2. android 7.0 手机调用手机相机、相册常见的两个崩溃:FileUriExpos
  3. Android(安卓)LockScreen .
  4. 【Android】网络监测
  5. android图片预览
  6. android改变分区权限
  7. android 从相机或者相册获取照片!
  8. Android平台上利用opencv进行图像的边沿检测
  9. 手势(Gesture)之手势检测(GestureDetector)

随机推荐

  1. 快速Android开发系列通信篇之EventBus
  2. Android系统
  3. Android将转为闭源模式么?
  4. Android的日志工具Log及制定日志工具
  5. [Android]直接使用代码建立Android视图元
  6. Ubuntu下android学习——(1)开发环境的搭建
  7. Android读写XML(中)——SAX
  8. 瘸腿蛤蟆笔记cocos2d-x-3.2移植到到andro
  9. iPhone和Android,谁将成为赢家?
  10. Android之常见安全问题