拍照及图片显示

来源:互联网 发布:马云阿里年会演讲 编辑:程序博客网 时间:2024/04/28 23:51

1、功能声明
当应用需要使用相机、NFC等外设时,需要在AndroidManifest.xml中进行声明。
这样,当设备缺少这些外设时,应用商店的安装程序可以拒绝安装设备。

声明示例代码如下:

<uses-feature android:name="android.hardware.camera2"        <!-- requiredfalse时,不强制要求设备支持该功能 -->        <!-- 如果不设置该值,一旦设备不支持camera,就不能安装该应用-->        android:required="false"/>

2、创建指向文件的File对象
拍摄的照片可以存放到设备的外部存储区。

Android为不同的应用分配的独有的存储区域,同时按照存储数据的类型对存储区域做了进一步地划分。
设置照片存储区域的代码示例如下所示:

public File getPhotoFile(Crime crime) {    //获取应用对应的存储照片的外部存储路径    File externalFilesDir = mContext            .getExternalFilesDir(Environment.DIRECTORY_PICTURES);    if (externalFilesDir == null) {        return null;    }    //创建指向文件的File对象    return new File(externalFilesDir, crime.getPhotoFilename());}.............//每个crime对应的文件名public String getPhotoFilename() {    return "IMG_" + getId().toString() + ".jpg";}

3、触发拍照
可以使用MediaStore.ACTION_CAPTURE_IMAGE类型的Intent触发拍照,示例代码如下:

mPhotoButton = (ImageButton) v.findViewById(R.id.crime_camera);//隐式Intent触发相机拍照final Intent captureImageIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//mPhotoFile保存着上文创建的指向指定地址的File//此处判断是否有能够处理隐式Intent的组件boolean canTakePhoto = mPhotoFile != null        && captureImageIntent.resolveActivity(packageManager) != null;mPhotoButton.setEnabled(canTakePhoto);if (canTakePhoto) {    //得到File文件对应的Uri地址    Uri uri = Uri.fromFile(mPhotoFile);    //将Uri地址存入到Intent中,相机拍照得到的图像将会存入到该Uri地址对应的File里    captureImageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);}mPhotoButton.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        startActivityForResult(captureImageIntent, REQUEST_PHOTO);    }});

4、处理拍照结果
拍照完成后,将可以加载得到图片了。

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {    .........    } else if (requestCode == REQUEST_PHOTO) {        updatePhotoView();    }    .........}private void updatePhotoView() {    if (mPhotoFile == null || !mPhotoFile.exists()) {        mPhotoView.setImageDrawable(null);    } else {        //加载图片对应的缩略图        Bitmap bitmap = PictureUtils.getScaledBitmap(mPhotoFile.getPath(), getActivity());        mPhotoView.setImageBitmap(bitmap);    }}

Bitmap只存储实际像素数据,因此即使原始照片已经压缩过,
但存入Bitmap对象时,文件并不会被压缩。

因此加载图片时,需要先按照给定区域的大小合理的缩放文件。
然后,用Bitmap加载缩放后的文件,示例代码如下:

//在具体视图未加载前,无法得到视图的实际大小//因此根据屏幕尺寸,使用估算值进行缩放public static Bitmap getScaledBitmap(String path, Activity activity) {    Point size = new Point();    activity.getWindowManager().getDefaultDisplay().getSize(size);    return getScaledBitmap(path, size.x, size.y);}public static Bitmap getScaledBitmap(String path, int destWidth, int destHeight) {    BitmapFactory.Options options = new BitmapFactory.Options();    options.inJustDecodeBounds = true;    //按照正常尺寸解析文件    BitmapFactory.decodeFile(path, options);    //得到原始文件的宽和高    float srcWidth = options.outWidth;    float srcHeight = options.outHeight;    //inSampleSize表示水平/竖直抽样比    //例如,inSampleSize为2时,水平和数值均在原始基础上,每2个点抽取1个点    //于是,新图的大小变为原来的1/4    int inSampleSize = 1;    if (srcHeight > destHeight || srcWidth > destWidth) {        if (srcWidth > srcHeight) {            inSampleSize = Math.round(srcHeight / destHeight);        } else {            inSampleSize = Math.round(srcWidth / destWidth);        }     }    options = new BitmapFactory.Options();    options.inSampleSize = inSampleSize;    //按新的抽样比,重新解析文件    return BitmapFactory.decodeFile(path, options);}
0 0
原创粉丝点击