@Tyhj
        
        2016-12-23T12:49:07.000000Z
        字数 2882
        阅读 2018
    教程
今天又用到了从相机或相册获取图片,然后又是从以前的代码直接复制过来,忘了给读取手机文件的权限,所以出了问题,然后我就研究了一下,发现我这个从《第一行代码》学来的方法是有问题的啊,当然之前做的时候就有个地方有小问题,之前解决了,今天已经忘了,但没关系了,现在我的总结了一下,应该是可以用的。
如果你照着代码打了,并且能用,那么你会发现,文件夹里面多了一个打不开的图片文件,叫"head.jpg"。 
虽然对程序没有多大影响,但是还是不好啊,不美观啊,还有你会发现你选择的图片会改变,就是影响到你本地的图片,或许你还要用,但是你剪掉了,没法复原,没备份。所以我就顺便整理一下代码,以后就直接从这里复制,也方便一点。
public static final int TAKE_PHOTO = 1;public static final int CROP_PHOTO = 2;public static final int PICK_PHOTO=0;
//相册@Click(R.id.btn_album)void album() {getDate();File file = new File(path, date);Intent intent = new Intent(ACTION_GET_CONTENT);intent.setType("image/*");intent.putExtra("crop", true);intent.putExtra("scale", true);intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));startActivityForResult(intent, PICK_PHOTO);}
//相机@Click(R.id.btn_camera)void camera() {getDate();File file = new File(path, date);Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));startActivityForResult(intent, TAKE_PHOTO);}
//剪裁图片public void cropPhoto(Uri imageUri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(imageUri, "image/*");intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);startActivityForResult(intent, CROP_PHOTO);}
//获取本地图片并更新界面@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {//这是从相机返回的数据case TAKE_PHOTO:if (resultCode == this.RESULT_OK) {File file = new File(path, date);cropPhoto(Uri.fromFile(file));}break;//这是从相册返回的数据case PICK_PHOTO:if (resultCode == this.RESULT_OK) {if (data != null) {imageUri = data.getData();}String path_pre = Defined.getFilePathFromContentUri(imageUri, contentResolver);File newFile = new File(path, date);Log.e("SendMesseg", path_pre);try {//复制图片Defined.copyFile(new File(path_pre), newFile);} catch (IOException e) {e.printStackTrace();}File file = new File(path, date);cropPhoto(Uri.fromFile(file));}break;//剪裁图片返回数据,就是原来的文件case CROP_PHOTO://获取到的就是new File或fileNameif (resultCode == this.RESULT_OK) {final String fileName = path + "/" + date;File newFile = new File(path, date);if (!isBigPicture) {Defined.ImgCompress(fileName, newFile, 200);Log.e("SendMessge", "剪裁了图片");}try {JSONObject json = new JSONObject(getJson.getMsg("null", 1, 0, MinaSocket.actionSignIn, linkMan.getId()));Messge messge = new Messge(json);//设置本地图片位置messge.setImagePath(fileName);updateView(messge);//保存图片到服务器savaImage(fileName,messges.size());} catch (JSONException e) {e.printStackTrace();}}break;default:break;}}
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
以上代码好像差不多吧,应该是能用的,我自己在用,有问题再说。额,其实最后在《剪裁图片返回数据》的那里就可以获取到你要的文件,对于手机来说一般是要用于上传的,所以在这里肯定是要进行压缩的,当从相册选择图片的时候,为了不破坏原图片应该复制一下,用复制后的图片来进行剪裁。
File file = new File(path, date);.....intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
在这里有个问题,就是在用相机拍照获取的图片一般可以通过Uri来获取,但是有些手机是会出问题的,所以用这个方法来实现,将这个图片输出到这个文件中,再获取这个文件,而对于相册来说这个方法又不可以,反正问题还是很多的,相册获取就采用imageUri来获取,在通过imageUri来找到这个文件的位置。