Android实现拍照及图片显示效果

 更新时间:2017年03月16日 17:27:15   作者:ZhangJianIsAStark  
这篇文章主要为大家详细介绍了Android实现拍照及图片显示效果 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android拍照及图片显示的具体代码,供大家参考,具体内容如下

1、功能声明

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

声明示例代码如下:

<uses-feature android:name="android.hardware.camera2"
    <!-- required为false时,不强制要求设备支持该功能 -->
    <!-- 如果不设置该值,一旦设备不支持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、处理拍照结果

拍照完成后,将可以加载得到图片了。

@Override
public 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);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Kotlin中协变、逆变和不变示例详解

    Kotlin中协变、逆变和不变示例详解

    这篇文章主要给大家介绍了关于Kotlin中协变、逆变和不变的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Android使用SQLite数据库的示例

    Android使用SQLite数据库的示例

    本篇文章主要介绍了Android使用SQLite数据库的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 实例详解Android快速开发工具类总结

    实例详解Android快速开发工具类总结

    这篇文章主要介绍了实例详解Android快速开发工具类总结的相关资料,需要的朋友可以参考下
    2016-01-01
  • android实现icon动态旋转效果

    android实现icon动态旋转效果

    这篇文章主要为大家详细介绍了android实现icon动态旋转效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Android内存泄漏终极解决篇(下)

    Android内存泄漏终极解决篇(下)

    这篇文章主要为大家介绍了Android内存泄漏的相关资料,哪些写法容易造成内存泄漏,该如何解决?感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Android设计模式之单例模式实例

    Android设计模式之单例模式实例

    这篇文章主要介绍了Android设计模式之单例模式实例,单例模式是运用最广泛的设计模式之一,在应用这个模式时,单例模式的类必须保证只有一个实例存在
    2023-04-04
  • Android自定义Toolbar使用方法详解

    Android自定义Toolbar使用方法详解

    这篇文章主要为大家详细介绍了Android自定义Toolbar使用方法 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • android使用Textview实现伸缩效果

    android使用Textview实现伸缩效果

    这篇文章主要为大家详细介绍了android使用Textview实现伸缩效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Android反编译代码和防止反编译

    Android反编译代码和防止反编译

    这篇文章主要介绍了Android反编译代码和防止反编译的相关资料,需要的朋友可以参考下
    2015-07-07
  • Android动态替换Application实现

    Android动态替换Application实现

    这篇文章主要介绍了Android动态替换Application实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论