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
接下来上代码:
源码下载:http://download.csdn.net/detail/xiong_it/8353941
转载时请保留链接:/article/2590615.html,谢谢!
首先,在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,谢谢!
相关文章推荐
- 解决android调用系统相机拍照保存时onActivityResult中data为null的问题
- 调用android系统相机拍照并保存
- Android调用系统相机拍照并保存图片文件
- Android调用系统相机拍照及图片保存的Uri方式------菜鸟学习历程
- android调用系统相机拍照并保存在本地
- Android调用系统相机拍照、从相册中取照片,裁剪,并保存到手机SD卡中,展示到界面
- Android 调用系统相机拍照保存以及调用系统相册的方法
- Android 调用系统相机拍照保存以及调用系统相册的方法
- Android 调用系统相机拍照保存以及调用系统相册的方法
- Android调用系统相机拍照保存照片很小解决方案
- android--调用系统相机拍照,显示并保存照片 - zhengwen
- 调用android系统相机拍照并保存
- Android 调用系统相机拍照保存以及调用系统相册的方法
- android--调用系统相机拍照,显示并保存照片
- 调用android系统相机拍照并保存
- Android 调用系统相机拍照保存以及调用系统相册的方法
- 调用android系统相机拍照并保存
- Android调用系统相机拍照、裁剪,并保存到手机SD卡中,展示到界面
- Android调用系统相机拍照并保存到SD卡的两种实现方式
- 调用android系统相机拍照并保存