[关闭]
@Tyhj 2016-12-23T12:49:07.000000Z 字数 2882 阅读 1746

Android从相机或相册获取图片

教程


今天又用到了从相机或相册获取图片,然后又是从以前的代码直接复制过来,忘了给读取手机文件的权限,所以出了问题,然后我就研究了一下,发现我这个从《第一行代码》学来的方法是有问题的啊,当然之前做的时候就有个地方有小问题,之前解决了,今天已经忘了,但没关系了,现在我的总结了一下,应该是可以用的。

问题所在

如果你照着代码打了,并且能用,那么你会发现,文件夹里面多了一个打不开的图片文件,叫"head.jpg"。
虽然对程序没有多大影响,但是还是不好啊,不美观啊,还有你会发现你选择的图片会改变,就是影响到你本地的图片,或许你还要用,但是你剪掉了,没法复原,没备份。所以我就顺便整理一下代码,以后就直接从这里复制,也方便一点。

  1. public static final int TAKE_PHOTO = 1;
  2. public static final int CROP_PHOTO = 2;
  3. public static final int PICK_PHOTO=0;
  1. //相册
  2. @Click(R.id.btn_album)
  3. void album() {
  4. getDate();
  5. File file = new File(path, date);
  6. Intent intent = new Intent(ACTION_GET_CONTENT);
  7. intent.setType("image/*");
  8. intent.putExtra("crop", true);
  9. intent.putExtra("scale", true);
  10. intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
  11. startActivityForResult(intent, PICK_PHOTO);
  12. }
  1. //相机
  2. @Click(R.id.btn_camera)
  3. void camera() {
  4. getDate();
  5. File file = new File(path, date);
  6. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  7. intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
  8. startActivityForResult(intent, TAKE_PHOTO);
  9. }
  1. //剪裁图片
  2. public void cropPhoto(Uri imageUri) {
  3. Intent intent = new Intent("com.android.camera.action.CROP");
  4. intent.setDataAndType(imageUri, "image/*");
  5. intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
  6. startActivityForResult(intent, CROP_PHOTO);
  7. }
  1. //获取本地图片并更新界面
  2. @Override
  3. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  4. switch (requestCode) {
  5. //这是从相机返回的数据
  6. case TAKE_PHOTO:
  7. if (resultCode == this.RESULT_OK) {
  8. File file = new File(path, date);
  9. cropPhoto(Uri.fromFile(file));
  10. }
  11. break;
  12. //这是从相册返回的数据
  13. case PICK_PHOTO:
  14. if (resultCode == this.RESULT_OK) {
  15. if (data != null) {
  16. imageUri = data.getData();
  17. }
  18. String path_pre = Defined.getFilePathFromContentUri(imageUri, contentResolver);
  19. File newFile = new File(path, date);
  20. Log.e("SendMesseg", path_pre);
  21. try {
  22. //复制图片
  23. Defined.copyFile(new File(path_pre), newFile);
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. File file = new File(path, date);
  28. cropPhoto(Uri.fromFile(file));
  29. }
  30. break;
  31. //剪裁图片返回数据,就是原来的文件
  32. case CROP_PHOTO:
  33. //获取到的就是new File或fileName
  34. if (resultCode == this.RESULT_OK) {
  35. final String fileName = path + "/" + date;
  36. File newFile = new File(path, date);
  37. if (!isBigPicture) {
  38. Defined.ImgCompress(fileName, newFile, 200);
  39. Log.e("SendMessge", "剪裁了图片");
  40. }
  41. try {
  42. JSONObject json = new JSONObject(getJson.getMsg("null", 1, 0, MinaSocket.actionSignIn, linkMan.getId()));
  43. Messge messge = new Messge(json);
  44. //设置本地图片位置
  45. messge.setImagePath(fileName);
  46. updateView(messge);
  47. //保存图片到服务器
  48. savaImage(fileName,messges.size());
  49. } catch (JSONException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. break;
  54. default:
  55. break;
  56. }
  57. }

好像就是这些了,别忘了开启读写文件的权限,好像是:

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

以上代码好像差不多吧,应该是能用的,我自己在用,有问题再说。额,其实最后在《剪裁图片返回数据》的那里就可以获取到你要的文件,对于手机来说一般是要用于上传的,所以在这里肯定是要进行压缩的,当从相册选择图片的时候,为了不破坏原图片应该复制一下,用复制后的图片来进行剪裁。

常见问题

  1. File file = new File(path, date);
  2. .....
  3. intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

在这里有个问题,就是在用相机拍照获取的图片一般可以通过Uri来获取,但是有些手机是会出问题的,所以用这个方法来实现,将这个图片输出到这个文件中,再获取这个文件,而对于相册来说这个方法又不可以,反正问题还是很多的,相册获取就采用imageUri来获取,在通过imageUri来找到这个文件的位置。

http://www.jb51.net/article/70671.htm

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注