您的位置:首页 > 移动开发 > Android开发

Android调用系统相机拍照并保存,解决OOM

2015-01-12 16:09 603 查看
在Android应用经常碰到需要调用相机拍照并保存的情况,这里笔者写了一个小小的Demo。

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



<!-- 写外部存储权限:保存相片用 -->

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

<!-- 挂载文件系统权限:这个没有也可以 -->

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

<!-- 拍照权限 -->

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

布局文件:activity_main.xml

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testcamera.MainActivity" >

    <Button
        android:id="@+id/take_photo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="Button" />

    <ImageView
        android:id="@+id/photo_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="140dp"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>


接下来上代码:

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;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		iniView();

		cameraButton.setOnClickListener(new OnClickListener() {

			@Override
			public 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);
	}

	/**
	 * 返回照片结果处理
	 */
	@Override
	protected 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

转载时请保留链接:/article/2590615.html,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: