[关闭]
@XQF 2017-02-10T20:33:27.000000Z 字数 3383 阅读 1034

权威使用隐式Intent拍照学习

《Android探险》


拍照功能,,。原来有两套使用方式。一种是比较简单的intent,使用的是系统的拍照界面和处理。另一种是使用camera的API来进行自定义拍照界面和功能等。
参考博文

关于这次的学习不仅仅是学习到了如何使用Intent实现照相功能。还有存储的一些东西。为什么会涉及到存储?因为我们拍摄的照片是很大的,。,。,放在数据库里不现实。而且我们的拍摄的照片用户希望能供其它程序使用。要是自定义ContentProvider也是比较麻烦的。。。索性我们把文件放到外面的存储中去。于是就要设计到应用程序访问外部存储的知识。我们使用Context类提供的方法很轻松就完成。而且还要申请读取外部存储的权限。

例子的实现就是现在外部存储中自定义个file。拍照之后把结果放在该file中。老实说系统这里处理得轻松,我们只需要使用startActivityForResult()方法发出intent,并把uri放进intent就可以了。至于怎么存储我们不管。

要注意的是,我们要判断系统究竟支不支持拍照功能,。,。。。如何判断尼,那就是使用PackageManager来实现。PackageManager来判断该intent要启动的任务是不是为空。要是为空的话就使得触发拍照按钮不可点击。

好,现在能拍照了,但是有需求说是拍完照我要显示一个缩略图在view里面。。。。。。好吧,接下来就是如何处理图片。事实上我们拍摄的照片本来就放在了onActivityResult()方法中的intent里。所以我们可以从这个intent中取出照片。也可以根据我们指定的路径,直接去该路径下进行解析。

好,图片我也找到了,可以,。,超级大,我的手机屏幕都放不下,接下来就是怎么处理。处理图像还是用位图方便。于是先通过BitmapFactory()获取一个options参数,设置参数的inJustDecodeBounds属性为true。使得我们能获取图片的实际大小。获取到实际大小后再来和我们的目标大小对比进行处理。怎么处理就是根据实际情况和需求来设定了。
option的inSampleSize参数就是设置缩放的比例,2就是使得新bitmap对象变为原来的一半。

后来,。,。注意到后面打开程序的时候

  1. public class UtilPicture {
  2. public static Bitmap getScaleBitMap(String path, int destWidth, int destHeight) {
  3. BitmapFactory.Options options = new BitmapFactory.Options();
  4. //吧这个属性设置为true就能获取图片的实际大小
  5. options.inJustDecodeBounds = true;
  6. BitmapFactory.decodeFile(path, options);
  7. float realWidth = options.outWidth;
  8. float realHeight = options.outHeight;
  9. //默认设置
  10. int inSampleSize = 1;
  11. // 要是实际尺寸超出目的尺寸就要进行操作
  12. if (realWidth > destWidth || realHeight > destHeight) {
  13. // 实际的宽比实际的高还要高,这里实现的策略是挑小的计算缩放的标准
  14. if (realWidth > realHeight) {
  15. inSampleSize = Math.round(realHeight / destHeight);
  16. } else {
  17. inSampleSize = Math.round(realWidth / destWidth);
  18. }
  19. }
  20. options = new BitmapFactory.Options();
  21. options.inSampleSize = inSampleSize;
  22. return BitmapFactory.decodeFile(path, options);
  23. }
  24. //很少使用activty实例,但是,。getWindowManager()方法是Activity特有
  25. // 获取windowManager还有另外一种方式,
  26. public static Bitmap getScaleBitMap(String path, Activity activity) {
  27. Point size = new Point();
  28. activity.getWindowManager().getDefaultDisplay().getSize(size);
  29. return getScaleBitMap(path, size.x, size.y);
  30. }
  31. }
  1. public class MyFragment extends Fragment {
  2. private static final int REQUEST_IMAGE = 1;
  3. private File mFile;
  4. private Button mBtn;
  5. private ImageView mImageView;
  6. private String mPhotoName = "IMG_11.jpg";
  7. @Override
  8. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  9. View view = inflater.inflate(R.layout.my_frag, container, false);
  10. mBtn = (Button) view.findViewById(R.id.takePhoto);
  11. mImageView = (ImageView) view.findViewById(R.id.imageView);
  12. updateUI();
  13. return view;
  14. }
  15. @Override
  16. public void onActivityCreated(Bundle savedInstanceState) {
  17. super.onActivityCreated(savedInstanceState);
  18. PackageManager pm = getActivity().getPackageManager();
  19. final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  20. if (null == intent.resolveActivity(pm)) {
  21. mBtn.setEnabled(false);
  22. } else {
  23. mFile = getFile();
  24. Uri uri = Uri.fromFile(mFile);
  25. intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
  26. mBtn.setOnClickListener(new View.OnClickListener() {
  27. @Override
  28. public void onClick(View view) {
  29. getActivity().startActivityForResult(intent, REQUEST_IMAGE);
  30. }
  31. });
  32. }
  33. }
  34. @Override
  35. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  36. if (resultCode == getActivity().RESULT_OK) {
  37. switch (requestCode) {
  38. case REQUEST_IMAGE:
  39. updateUI();
  40. break;
  41. }
  42. }
  43. }
  44. private File getFile() {
  45. File file = getActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES);
  46. //没有这块存储
  47. if (null == file) {
  48. return null;
  49. }
  50. return new File(file, mPhotoName);
  51. }
  52. private void updateUI() {
  53. if (null == mFile) {
  54. mImageView.setImageDrawable(null);
  55. } else {
  56. mImageView.setImageBitmap(UtilPicture.getScaleBitMap(mFile.getPath(), getActivity()));
  57. }
  58. }
  59. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注