在实现拍照的功能时遇到了很多问题,搜索了很多资料,尝试了很多办法,终于解决了,下面简要的描述下在开发过程中遇到的问题。
虽然之前看过android开发的书,但是没有做过东西,这次也是临时决定让我做一个android采集系统的演示程序。拍照是其中一个功能,让网搜索了下拍照有两种方式,其中一种就是调用系统相机实现拍照功能。
启动照相机进行拍照,代码如下:
- btnCamera.setOnClickListener(newButton.OnClickListener()
- {
- publicvoidonClick(Viewv)
- {
- Intenti=newIntent("android.media.action.IMAGE_CAPTURE");
- startActivityForResult(i,Activity.DEFAULT_KEYS_DIALER);
- }
- });
- @Override
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata)
- {
- switch(resultCode)
- {
- caseRESULT_OK:
- super.onActivityResult(requestCode,resultCode,data);
- if(data!=null){
- Bundleextras=data.getExtras();
- Bitmapbmp=(Bitmap)extras.get("data");
- ivstorepic.setImageBitmap(bmp);//设置照片现实在界面上
- hasShootPic=true;//此变量是在提交数据时,验证是否有图片用
- }
- else
- {
- hasShootPic=false;
- }
- break;
- default:
- break;
- }
- }
- publicstaticfinalStringSDCARD_ROOT_PATH=android.os.Environment.getExternalStorageDirectory().getAbsolutePath();//路径
- publicstaticfinalStringSAVE_PATH_IN_SDCARD="/bi.data/";//图片及其他数据保存文件夹
- publicstaticfinalStringIMAGE_CAPTURE_NAME="cameraTmp.png";//照片名称
- publicfinalstaticintREQUEST_CODE_TAKE_PICTURE=12;//设置拍照操作的标志
启动相机进行拍照,代码如下:
- btnCamera.setOnClickListener(newButton.OnClickListener(){
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
- //存储卡可用将照片存储在sdcard
- if(SimpleFileTool.isHasSdcard()){
- intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(newFile(SDCARD_ROOT_PATH+
- SAVE_PATH_IN_SDCARD,IMAGE_CAPTURE_NAME)));
- }
- startActivityForResult(intent,REQUEST_CODE_TAKE_PICTURE);
- }
- });
获取拍照后图片数据,代码如下:
- @Override
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
- if(resultCode==RESULT_OK){
- if(requestCode==REQUEST_CODE_TAKE_PICTURE){//拍照返回
- //存储卡可用
- if(isHasSdcard()){
- getImage(SDCARD_ROOT_PATH+SAVE_PATH_IN_SDCARD+IMAGE_CAPTURE_NAME);
- }
- else{
- //存储卡不可用直接返回缩略图
- Bundleextras=data.getExtras();
- bitmap=(Bitmap)extras.get("data");
- img.setImageBitmap(bitmap);
- img.setVisibility(View.VISIBLE);
- hasShootPic=false;
- }
- }
- }
- super.onActivityResult(requestCode,resultCode,data);
- /**
- *检查存储卡是否插入
- *@return
- */
- publicstaticbooleanisHasSdcard()
- {
- Stringstatus=Environment.getExternalStorageState();
- if(status.equals(Environment.MEDIA_MOUNTED)){
- returntrue;
- }else{
- returnfalse;
- }
- }
- /*获得图片图片高度最大maxH
- *@paramimagePath
- */
- Bitmapbitmap;
- intmaxH=200;//
- privatevoidgetImage(StringimagePath){
- BitmapFactory.Optionsoptions=newBitmapFactory.Options();
- options.inJustDecodeBounds=true;
- //获取这个图片的宽和高
- bitmap=BitmapFactory.decodeFile(imagePath,options);//此时返回bm为空
- //计算缩放比
- intbe=(int)(options.outHeight/(float)maxH);
- intys=options.outHeight%maxH;//求余数
- floatfe=ys/(float)maxH;
- if(fe>=0.5)be=be+1;
- if(be<=0)
- be=1;
- options.inSampleSize=be;
- //重新读入图片,注意这次要把options.inJustDecodeBounds设为false
- options.inJustDecodeBounds=false;
- bitmap=BitmapFactory.decodeFile(imagePath,options);
- img.setImageBitmap(bitmap);
- img.setVisibility(View.VISIBLE);
- }
以上代码,实现功能实际上是直接把图片存储在SDcard内,然后读取数据现实,后面之所以加上一个直接获取数据返回的代码,是为了兼容一些手机。测试了几款手机后发现可正常,使用也算解决了目前遇到的问题。记录下来,备忘。