@Tyhj
2016-12-23T20:49:07.000000Z
字数 2882
阅读 1783
教程
今天又用到了从相机或相册获取图片,然后又是从以前的代码直接复制过来,忘了给读取手机文件的权限,所以出了问题,然后我就研究了一下,发现我这个从《第一行代码》学来的方法是有问题的啊,当然之前做的时候就有个地方有小问题,之前解决了,今天已经忘了,但没关系了,现在我的总结了一下,应该是可以用的。
如果你照着代码打了,并且能用,那么你会发现,文件夹里面多了一个打不开的图片文件,叫"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);
}
//获取本地图片并更新界面
@Override
public 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或fileName
if (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来找到这个文件的位置。