Android调用系统拍照

在今天的学习中,使用了横向的滚动控件 HorizontalScrollView,并在其中添加一个横向的LinearLayout 来实现动态调用系统相机,拍摄并保存图片的一个逻辑,下面我就来进行详细的介绍。

基本思路就是 保存拍照返回的路径集合(List),根据路径集合中的内容生成Bitmap(位图),然后对图片进行一定的处理(缩放,压缩)。接着创建 ImageView 实例,并将ImageView 实例添加到 LinearLayout 中。

布局我就不详细介绍了,无非就是HorizontalScrollView控件中嵌套一个子布局 LinearLayout。

代码如下:

public static  ArrayList   filePaths ;    / /图片地址的集合

@Override

protected void   onResume() {      //界面可见,且可与用户交互

      super.onResume();

             if( filePaths!=null ){

                  mLinearLayout.removeAllViews();

                  mLinearLayout.setVisibility(View.VISIBLE);

                   for (int  i=0 ; i<= filePaths.size() ;i++){

                            ImageView imageView  =  new  ImageView(this);

                           LinearLayout.LayoutParams params=newLinearLayout.LayoutParams(200,200);

                           params.rightMargin=10;

                           params.leftMargin=10;

                          imageView.setLayoutParams(params);

                         if  (  i <  filePaths.size() )  {

                                  File   file  = new  File( filePaths.get(i) );

                                  if(  file.exists() ){ 

                                          Bitmap bitmap= BitmapFactory.decodeFile(filePaths.get(i));

                                          imageView.setImageBitmap(bitmap);

                                   }else{

                                          imageView.setImageResource(R.mipmap.default_img);   }

                        }else{

                               imageView.setImageResource(R.mipmap.btn_add_img);

                               }

                      mLinearLayout.addView(imageView,i);

                      ImageViewOnClick(imageView,i);  / /   ImageView 的点击事件

                     }

}

}

上述代码中 ,是根据 图片路径集合的长度来创建 ImageView 实例的,并添加到LinearLayout 中。默认添加一个图片,用来点击调用系统的拍照。当点击图片时,如不是默认图片,则跳转到图片详情页,否则调用系统拍照。

图片详情页使用的是 PhotoView,是一个比较常用的图片开源库,可以根据手势来缩放图片。

下面是调用系统拍照的代码:

        Intent intent=new Intent( MediaStore.ACTION_IMAGE_CAPTURE);

        Uri uri=Uri.fromFile(newFile(mImgPath));

        intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);

        intent.putExtra(MediaStore.Images.ImageColumns.ORIENTATION,0);

        startActivityForResult(intent,1001);

其中 mImgPath 是拍照图片保存的路径。需要自己手动生成。

然后就是 onActivityResult()方法啦,拍照后 图片的内容就保存在 mImgPath 这个路径之中。我们需要在这个方法中对 图片进行一些必要的处理。

处理的原因是,现在的手机像素非常高了,拍成的图片一般都比较大,如果不对图片进行处理,会很容易造成内存溢出,从而使你的应用崩溃。在这里推荐一个图片压缩的第三方库,Luban 压缩,可以去研究下。

图片的处理代码如下:

Bitmap bitmap= ImageTools.convertToBitmap(mImgPath,800,800); // 转换成图片

Bitmap bitmapComp=ImageTools.comp(bitmap);//进行图片压缩

ImageTools.saveBitmap(bitmapComp,mImgPath);//保存图片

if(bitmap!=null){

        filePaths.add(mImgPath);

}

这里代码的基本思路就是,对拍照返回的路径中的内容转换成图片,并对图片进行压缩处理,然后将图片保存到拍照返回的路径中,最后将路径添加到集合中。

你可能感兴趣的:(Android调用系统拍照)