Android调用系统相机拍照并保存,解决OOM
16lz
2021-01-25
在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
接下来上代码:
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,谢谢!
更多相关文章
- uses-permission android:name="android.permission.INSTALL_PAC
- android 7.0 手机调用手机相机、相册常见的两个崩溃:FileUriExpos
- Android(安卓)LockScreen .
- 【Android】网络监测
- android图片预览
- android改变分区权限
- android 从相机或者相册获取照片!
- Android平台上利用opencv进行图像的边沿检测
- 手势(Gesture)之手势检测(GestureDetector)