之前在网上搜的代码,都是返回data,通过data来显示图片并上传,可是在部分手机上照相机照相之后截图卡死了,之后我就不使用data来做后续的操作了,直接使用文件做后续操作,可是当改完之后又出现问题了,在小米和华为手机上调用图库的照片并截图也卡死了,为了解决这个问题,图库截图之后也不让它返回data了,而是将bitmap转化为file,将这个file复制给之前照相机的那个file,之后的方法就跟照相机截图的那个一样了。可能说的有点儿不清楚,直接上代码吧~~~~~~
File tempFile = new File(FileUtil.cachePath, "temp_avatar.jpg");
1,点击从相册中选择的时候
else if(v == photoLibBtn){
selectPic();
}2.选择图片
private void selectPic(){
Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent, SELECT_PIC_CODE);
}
3.处理返回的图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//选择图库图片
if(resultCode == RESULT_OK && data != null && requestCode == SELECT_PIC_CODE){
startPhotoZoom(Uri.fromFile(copyfile(getImageBitmap(data), tempFile)), 640,CUT_PIC_CODE);
}
4.调用系统截图方法
private void startPhotoZoom(Uri uri, int size,int CUT_CODE) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
intent.putExtra("outputFormat", "JPEG");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY 是剪裁图片的宽高
intent.putExtra("outputX", size);
intent.putExtra("outputY", size);
intent.putExtra("scale", true);
intent.putExtra("noFaceDetection", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra("return-data", false);
startActivityForResult(intent, CUT_PIC_CODE);
}
5. startPhotoZoom的第一个参数(1)先将bitmap转化为file
//通过data拿到bitmap再转化为file
public File getImageBitmap(Intent data){
Uri selectedImage = data.getData();
String[] filePathColumns = { MediaStore.Images.Media.DATA };
Cursor c = this.getContentResolver().query(selectedImage,
filePathColumns, null, null, null);
if(c == null){
Util.showShortToast(this, R.string.person_info_base_pic);
return null;
}
c.moveToFirst();
int columnIndex = c.getColumnIndex(filePathColumns[0]);
String picturePath = c.getString(columnIndex);
File file = new File(picturePath);
return file;
}
(2)
//将一个file复制给另一个file
public static File copyfile(File fromFile, File toFile) {
if (!fromFile.exists()) {
return null;
}
if (!fromFile.isFile()) {
return null;
}
if (!fromFile.canRead()) {
return null;
}
if (!toFile.getParentFile().exists()) {
toFile.getParentFile().mkdirs();
}
try {
java.io.FileInputStream fosfrom = new java.io.FileInputStream(fromFile);
java.io.FileOutputStream fosto = new FileOutputStream(toFile);
byte bt[] = new byte[1024];
int c;
while ((c = fosfrom.read(bt)) > 0) {
fosto.write(bt, 0, c); // 将内容写到新文件当中
}
fosfrom.close();
fosto.close();
} catch (Exception ex) {
Log.e("readfile", ex.getMessage());
}return toFile;
}
1.点击照相机
selectPic();
else if(v == cameraBtn){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(tempFile));
startActivityForResult(intent, CAMERA_PIC_CODE);
}