照相机---调用
ZTE-N760
摄像头像素:320万像素,最大支持2048×1536像素照片拍摄
屏幕分辨率:3.5英寸,分辨率为480×320的电容式屏幕
像素和尺寸:每一厘米等于28像素;若分辨率不变,增加照片尺寸,就会出现马赛克;在COMS/CCD尺寸不变的情况下,像素越低,打印出来的照片越小,像素越高,打印出来的照片就越大。
?
1.调用自带照相机进行照相,然后返回,并保存到指定目录下,预览照片。结果如下:
?
?
2.程序代码
?
package com.photos;
?
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
?
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;//供访问环境变量
import android.app.Activity;
import android.content.Intent;
import android.view.Display;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.Button;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
?
?
publicclass MainActivity extends Activity {
??? finalstaticintCAMERA_RESULT = 0;
??? Button mButton1;
??? ImageView mImageView1;
??? String imageFilePath;
?
??? @Override
??? protectedvoid onCreate(Bundle savedInstanceState) {
?????? super.onCreate(savedInstanceState);
?????? setContentView(R.layout.activity_main);
?????? mButton1 = (Button)findViewById(R.id.myButton1);
??????
?????? //点击照相按钮响应
?????? mButton1.setOnClickListener(new Button.OnClickListener(){
?
?????????? @Override
?????????? publicvoid onClick(View arg0) {
????????????? // TODO Auto-generated method stub
????????????? // 获取系统的时间:年月日_时分秒作为文件名称
????????????? String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
?????????????
????????????? // 获取SD卡路径返回扩展存储区目录(SDCard)+子目录/DCIM/mytest+File.separator是一个分隔符"" + 文件名称?
????????????? imageFilePath = Environment.getExternalStorageDirectory()?
?????? ??????????????? .toString()+"/DCIM/mytest" + File.separator+”IMG_”+timeStamp +".jpg";?
?????? ??????
????????????? // 在指定路径下,新建文件用来存储照片信息
????????????? File imageFile = new File(imageFilePath);?
?????? ???????
????????????? //URI是统一资源标识符(Uniform Resource Identifier) 的意思,它的作用是根据这个URI找到某个资源文件
????????????? Uri imageFileUri = Uri.fromFile(imageFile);?
?????????????
????????????? //new一个Intent 调用照相机照相
?????? ??????? Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);?
?????? ??????? i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);?
?????? ??????? //调用一个新的Activity
?????? ??????? startActivityForResult(i, CAMERA_RESULT);?
?????????? }
?????????? ;
?????? });
??? }
?????? @Override
??? protectedvoid onActivityResult(int requestCode, int resultCode, Intent data) {
?????? // TODO Auto-generated method stub
??????
?????? super.onActivityResult(requestCode, resultCode, data);
??????
?????? //如果拍照成功?
??????? if (resultCode == RESULT_OK) {?
???????
??????? //获取ImageView控件
?????????? mImageView1 = (ImageView) findViewById(R.id.myImageView1);?
?
??????????? //取得屏幕的显示大小?
??????????? Display currentDisplay = getWindowManager().getDefaultDisplay();?
??????????? int dw = currentDisplay.getWidth();?
??????????? int dh = currentDisplay.getHeight();?
??????????? /**
???????????? * 为了计算缩放的比例,我们需要获取整个图片的尺寸,而不是图片
???????????? * BitmapFactory.Options类中有一个布尔型变量inJustDecodeBounds,将其设置为true
???????????? * 这样,我们获取到的就是图片的尺寸,而不用加载图片了。
???????????? * 当我们设置这个值的时候,我们接着就可以从BitmapFactory.Options的outWidth和outHeight中获取到值
???????????? */?
??????????? //对拍出的照片进行缩放?
??????????? BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();?
?????????
??????????? //将其设置为true来获取图片尺寸了
??????????? bmpFactoryOptions.inJustDecodeBounds = true;?
??????????? Bitmap bmp = BitmapFactory.decodeFile(imageFilePath,?
??????????????????? bmpFactoryOptions);?
?
???? ???????int heightRatio = (int) Math.ceil(bmpFactoryOptions.outHeight?
??????????????????? / (float) dh);? //计算高度比例?
??????????? int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth?
??????????????????? / (float) dw);? //计算宽度比例?
?????????????
? ??????????/**
???????????? * 接下来,我们就需要判断是否需要缩放以及到底对宽还是高进行缩放。
???????????? * 如果高和宽不是全都超出了屏幕,那么无需缩放。
???????????? * 如果高和宽都超出了屏幕大小,则如何选择缩放呢》
???????????? * 这需要判断wRatio和hRatio的大小
???????????? * 大的一个将被缩放,因为缩放大的时,小的应该自动进行同比率缩放。
???????????? * 缩放使用的还是inSampleSize变量
???????????? */
??????????? if (heightRatio > 1 && widthRatio > 1) {?
????????????????? if (heightRatio > widthRatio) {?
????????????????????? bmpFactoryOptions.inSampleSize = heightRatio;?
??????????????? } else {?
??????????????????? bmpFactoryOptions.inSampleSize = widthRatio;?
??????????????? }?
????????????? }?
? //注意这里,一定要设置为false,因为上面我们将其设置为true来获取图片尺寸了?
??????????? bmpFactoryOptions.inJustDecodeBounds = false;
??????????? bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);?
????????????? mImageView1.setImageBitmap(bmp);?
????????? }?
??? }
??? @Override
??? publicboolean onCreateOptionsMenu(Menu menu) {
?????? // Inflate the menu; this adds items to the action bar if it is present.
?????? getMenuInflater().inflate(R.menu.main, menu);
?????? returntrue;
??? }
}
调用自带的摄像机:
??? Intent i = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);?
?????? ??????? i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri);
?????? ??????? i.putExtra(android.provider.MediaStore.EXTRA_VIDEO_QUALITY, 1);//设置视频
?
不知道为什么,在调用摄像机的时候,加入我设置了路径,那么保存下来的录像文件竟然是空的,不懂?所以我设置了错误的路径,就是在SD卡上不存在的路径,那么保存下来的录像文件就保存在了默认文件夹下 DCIM/Camera/ 这时候文件是好的??不懂为什么?
?
?