拍照裁剪报错 无法加载此图片

stevenzqzq 2016-04-08 02:47:15

package com.jerry.uploadimg;

import java.io.ByteArrayOutputStream;
import java.io.File;

import org.apache.http.Header;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;

public class MainActivity extends Activity {

private static final int PHOTO_REQUEST_CAMERA = 1;// 拍照
private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择
private static final int PHOTO_REQUEST_CUT = 3;// 结果

private ImageView mFace;
private Bitmap bitmap;
//(关键是这个地方,当修改为private static final String PHOTO_FILE_NAME = "/home/temp_photo.jpg 这是程序就会报错---无法加载此图片,这是为什么呢??)

/* 头像名称 */
private static final String PHOTO_FILE_NAME = "/home/temp_photo.jpg";
private File tempFile;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mFace = (ImageView) this.findViewById(R.id.iv_image);

}



/*
* 从相册获取
*/

public void gallery(View view) {
// 激活系统图库,选择一张图片
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
}

/*
* 从相机获取
*/


public void camera(View view) {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// 判断存储卡是否可以用,可用进行存储
if (hasSdcard()) {
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), PHOTO_FILE_NAME)));
}
startActivityForResult(intent, PHOTO_REQUEST_CAMERA);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PHOTO_REQUEST_GALLERY) {
if (data != null) {
// 得到图片的全路径
Uri uri = data.getData();
Log.d("MainActivity", ""+uri);
crop(uri);
}

} else if (requestCode == PHOTO_REQUEST_CAMERA) {
if (hasSdcard()) {
tempFile = new File(Environment.getExternalStorageDirectory(),
PHOTO_FILE_NAME);
String a = tempFile.getAbsolutePath();
String b = tempFile.getPath();
Log.d("MainActivity", "a=="+a);
Log.d("MainActivity", "b=="+b);
crop(Uri.fromFile(tempFile));
} else {
Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!", 0).show();
}

} else if (requestCode == PHOTO_REQUEST_CUT) {
try {
bitmap = data.getParcelableExtra("data");
Log.d("MainActivity", "bitmap=="+bitmap);
this.mFace.setImageBitmap(bitmap);
boolean delete = tempFile.delete();
System.out.println("delete = " + delete);

} catch (Exception e) {
e.printStackTrace();
}

}

super.onActivityResult(requestCode, resultCode, data);
}

/**
* 剪切图片
*
* @function:
* @author:Jerry
* @date:2013-12-30
* @param uri
*/


private void crop(Uri uri) {
// 裁剪图片意图
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", 250);
intent.putExtra("outputY", 250);
// 图片格式
intent.putExtra("outputFormat", "JPEG");
intent.putExtra("noFaceDetection", true);// 取消人脸识别
intent.putExtra("return-data", true);// true:不返回uri,false:返回uri
startActivityForResult(intent, PHOTO_REQUEST_CUT);
}

private boolean hasSdcard() {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return true;
} else {
return false;
}
}
}


...全文
420 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_30440511 2018-06-22
  • 打赏
  • 举报
回复
我是在 android 7.0 之后遇到的这个问题,因为需要动态加载文件权限 uri
如何动态加载 uri 权限可以看下链接
https://blog.csdn.net/u011315960/article/details/70057611

之后在你裁剪的方法中加入
if (Build.VERSION.SDK_INT >= 24) {
Uri photoUri = FileProvider.getUriForFile(
getActivity(),
"com.zyue.fileprovider",
file);
intent.setDataAndType(photoUri, "image/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//就这个特别重要,要通知 intent 具有该权限

} else {
intent.setDataAndType(Uri.fromFile(file), "image/*");
}
stevenzqzq 2016-04-16
  • 打赏
  • 举报
回复
更正上面的代码应该是这样的 private static final String PHOTO_FILE_NAME = "/temp_photo.jpg"; package com.jerry.uploadimg; import java.io.ByteArrayOutputStream; import java.io.File; import org.apache.http.Header; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Base64; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; public class MainActivity extends Activity { private static final int PHOTO_REQUEST_CAMERA = 1;// 拍照 private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择 private static final int PHOTO_REQUEST_CUT = 3;// 结果 private ImageView mFace; private Bitmap bitmap; //(关键是这个地方,当修改为private static final String PHOTO_FILE_NAME = "/home/temp_photo.jpg 这是程序就会报错---无法加载此图片,这是为什么呢??) /* 头像名称 */ private static final String PHOTO_FILE_NAME = "/temp_photo.jpg"; private File tempFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.mFace = (ImageView) this.findViewById(R.id.iv_image); } /* * 从相册获取 */ public void gallery(View view) { // 激活系统图库,选择一张图片 Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, PHOTO_REQUEST_GALLERY); } /* * 从相机获取 */ public void camera(View view) { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); // 判断存储卡是否可以用,可用进行存储 if (hasSdcard()) { intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment .getExternalStorageDirectory(), PHOTO_FILE_NAME))); } startActivityForResult(intent, PHOTO_REQUEST_CAMERA); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == PHOTO_REQUEST_GALLERY) { if (data != null) { // 得到图片的全路径 Uri uri = data.getData(); Log.d("MainActivity", ""+uri); crop(uri); } } else if (requestCode == PHOTO_REQUEST_CAMERA) { if (hasSdcard()) { tempFile = new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_NAME); String a = tempFile.getAbsolutePath(); String b = tempFile.getPath(); Log.d("MainActivity", "a=="+a); Log.d("MainActivity", "b=="+b); crop(Uri.fromFile(tempFile)); } else { Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!", 0).show(); } } else if (requestCode == PHOTO_REQUEST_CUT) { try { bitmap = data.getParcelableExtra("data"); Log.d("MainActivity", "bitmap=="+bitmap); this.mFace.setImageBitmap(bitmap); boolean delete = tempFile.delete(); System.out.println("delete = " + delete); } catch (Exception e) { e.printStackTrace(); } } super.onActivityResult(requestCode, resultCode, data); } /** * 剪切图片 * * @function: * @author:Jerry * @date:2013-12-30 * @param uri */ private void crop(Uri uri) { // 裁剪图片意图 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true"); // 裁剪框的比例,1:1 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // 裁剪后输出图片的尺寸大小 intent.putExtra("outputX", 250); intent.putExtra("outputY", 250); // 图片格式 intent.putExtra("outputFormat", "JPEG"); intent.putExtra("noFaceDetection", true);// 取消人脸识别 intent.putExtra("return-data", true);// true:不返回uri,false:返回uri startActivityForResult(intent, PHOTO_REQUEST_CUT); } private boolean hasSdcard() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { return true; } else { return false; } } }
jklwan 2016-04-08
  • 打赏
  • 举报
回复
是开始裁剪报错,还是裁剪完报错的?如果是开始裁剪报的错,可能是因为路径的问题,你拍照保存的路径没有权限访问,因为你是放到sd卡的。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧