最近在开发的时候遇到了选取图片并剪切的功能,本来想着这功能并不难,就没有很在意在搞定了7.0权限后代码一气呵成,写完那自己的手机一测,完美运行没问题,但是当项目提交到测试那里时却出现了问题他的手机裁剪后无法保存图片,当时我一脸茫然,拿来他的手机一看是锤子的,我去罗哥的手机这是第一次见有人用,当时我就把手机拿来测了下,结果发现了个奇怪的问题。
当时我的代码是这样的
private void cropImageUri(Uri sourceUri, Uri tagrgetUri, int outputX, int outputY, int requestCode) {
Log.d(TAG, "cropImageUri: ------"+sourceUri);
Intent intent = new Intent("com.android.camera.action.CROP",null);
intent.setDataAndType(sourceUri, "image/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra("crop", "true");
if (crop != -1) {
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("aspectX", 100);
intent.putExtra("aspectY", 100);
}
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tagrgetUri);
// 设置不返回数据,防止有些图片过大,传回bitmap出错
intent.putExtra("return-data", false);
intent.putExtra("noFaceDetection", true); // no face detection
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
Log.d(TAG, "cropImageUri: -----"+Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, requestCode);
}
代码检查了好多次,还从网上找了些对比没什么问题,有输出的url也有输入的,按道理不可能不行,后来我在返回的地方大了log看到输出文件的长度为0,这时我才明白原来文件没写进去,但是很奇怪为什么别的手机可以,我有试了多次,有一次成功了,这时我在想会不会有延时造成文件还未弄完就处理了,我在返回的地方加了个延迟的处理一开始没什么区别但是当我把延迟加到7秒时就能明显的看到成功,文件也有了长度,看来延迟是有效果的,但是在实际操作时肯定不能这么做啊,为了解决这个问题百度了半天试了很多办法最后真的让我找到了
if (tmpFile != null && tmpFile.length() > 0) {
setResult(RESULT_OK, new Intent(ExitFromSettings.this, PersonDetailActivity.class).putExtra("filename", tmpFile.getAbsolutePath()));
finish();//文件正常直接使用
}else if (tmpFile!=null&&tmpFile.length() == 0){
try {//不正常先转换为bitmap在转成文件使用
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(targetUri));
File file = saveBitmapFile(bitmap, Environment.getExternalStorageDirectory().getAbsolutePath() + Constant.IMAGE_CACHE_PATH_ORIGINA + System.currentTimeMillis() + ".jpg");
setResult(RESULT_OK, new Intent(ExitFromSettings.this, PersonDetailActivity.class).putExtra("filename", file.getAbsolutePath()));
finish();
Log.d(TAG, "onActivityResult: ++"+bitmap.getHeight()+file.length());
} catch (FileNotFoundException e) {
Log.d(TAG, "onActivityResult: ---+");
}
当文件长度为0是,先用url把生成bitmap在把bitmap转成文件,这样就完美解决了这个问题。问题虽然解决了但我并不清楚为什么会这样,如果大家知道请告知我谢谢