这是对上篇"android 图片拍照,相册选图,剪切并显示"的文章之后的 改进

上一篇文章虽然能解决图片的拍照剪切以及显示,但是发现他有一个缺点, 如果该程序单独运行,貌似没有任何问题, 但是把它整合到项目中后,发现有时在小米手机或者三星手机上面仍旧会失败, 原因可能是 拍照后导致内存不足,从而拍照后返回的时候,没有返回数据,导致图片显示失败,当然这是一定的概率事件.

针对这一情况做如下改变,代码如下:

package com.kuiboo.xiaoyao.Activity;

import android.app.Activity;
import android.content.Intent;
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.Log;
import android.view.View;
import android.widget.Toast; import com.kuiboo.xiaoyao.R;
import com.kuiboo.xiaoyao.util.ActionSheetDialog;
import com.kuiboo.xiaoyao.util.CircleImageView; import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Random; public class EditMineActivity extends Activity {
private static final String TAG = "MainActivity";
private static final int TAKE_SMALL_PICTURE = 2;
private static final int CROP_BIG_PICTURE = 3;
private static final int CROP_SMALL_PICTURE = 4;
private static final int CHOOSE_SMALL_PICTURE = 6;
private static final String IMAGE_FILE_LOCATION = "file:///sdcard/temp.jpg";
private Uri imageUri;//存储图片的uri地址
CircleImageView iv;//自定义圆形图片,或者使用第三方库,或者基本ImageView都可以
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mine_edit);
Log.e("执行了几次","aaa");
iv= (CircleImageView) findViewById(R.id.photoView);
iv.setBorderWidth(5);
imageUri = Uri.parse(IMAGE_FILE_LOCATION);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new ActionSheetDialog(EditMineActivity.this).Builder()
.addSheetItem("拍照", ActionSheetDialog.SheetItemColor.BULE, new ActionSheetDialog.OnSheetItemClickListener() {
@Override
public void onClick(int witch) {
openCamera();
}
}).addSheetItem("打开相册", ActionSheetDialog.SheetItemColor.BULE, new ActionSheetDialog.OnSheetItemClickListener() {
@Override
public void onClick(int witch) {
openPic();
}
}).show();
}
});
} //获取相册图片
private void openPic() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 2);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 100);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, CHOOSE_SMALL_PICTURE);
} //获取拍照小图片
private void openCamera() {
if(imageUri == null) {
Log.e(TAG, "图片uri不能为空!");
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_SMALL_PICTURE);
}
//剪切
private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode){
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 2);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // 没有人脸识别
startActivityForResult(intent, requestCode);
} private Bitmap decodeUriAsBitmap(Uri uri){
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return bitmap;
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != Activity.RESULT_OK){
Log.e(TAG, "requestCode = " + requestCode);
Log.e(TAG, "resultCode = " + resultCode);
Log.e(TAG, "data = " + data);
return;
}else{
switch (requestCode) {
// case CROP_BIG_PICTURE://剪切大图
// if(imageUri != null){
// Bitmap bitmap = decodeUriAsBitmap(imageUri);
// iv.setImageBitmap(bitmap);
// }
// break;
case TAKE_SMALL_PICTURE://拍照
cropImageUri(imageUri, 260, 200, CROP_SMALL_PICTURE);
break;
case CROP_SMALL_PICTURE://剪切小图
if(imageUri != null){
Bitmap bitmap = decodeUriAsBitmap(imageUri);
iv.setImageBitmap(bitmap);
}else{
Log.e(TAG, "CROP_SMALL_PICTURE: data = " + data);
}
break; case CHOOSE_SMALL_PICTURE://相册选择
if(data != null){
Bitmap bitmap = data.getParcelableExtra("data");
iv.setImageBitmap(bitmap);
}else{
Log.e(TAG, "CHOOSE_SMALL_PICTURE: data = " + data);
}
break;
}
}
}
}

效果图就不上了 ,和上一篇文章效果图一样.

最新文章

  1. 夺命雷公狗-----React---16--事件操作事件
  2. leetcode Pascal's triangle
  3. 用c#开发微信 (7) 微渠道 - 推广渠道管理系统 2 业务逻辑实现
  4. WEB项目web.xml文件中classpath: 跟classpath*:使用的区别
  5. 前端程序员:月薪 5K 到 5 万,我干了啥(转)
  6. sim卡中的汉字存储格式
  7. Codeforces Round #275 (Div. 2) C - Diverse Permutation (构造)
  8. 读 Working with forms 一些心得
  9. 训练赛 Grouping(强连通分量缩点 + DAG求最长路)
  10. leetcode[105] Construct Binary Tree from Inorder and Postorder Traversal
  11. 如何在vue-cli webpack中全局引入jquery
  12. js中this详解
  13. jquery ajax中success与complete的执行顺序
  14. Linux下GitLab服务器搭建
  15. [加密解密]CryptoAPI简介
  16. Fiddler插件开发 - 实现网站离线浏览功能
  17. lambda 表达式拼接
  18. 用大白话谈谈XSS与CSRF
  19. AsyncTask POST请求
  20. 从一个例子学习 instanceof 和 getclass 的区别

热门文章

  1. 帝国CMS(EmpireCMS) v7.5 前台XSS漏洞分析
  2. AutoResetEvent控制线程用法
  3. 用Python写了个下载快手视频的小脚本
  4. 用Canvas实现Photoshop的钢笔工具(贝塞尔曲线)
  5. offsetX、clientX、screenX、pageX、layerX
  6. ssh通过pem文件登陆服务器
  7. com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
  8. deepin 15.11 成功安装 jupyter notebook
  9. unity_实用小技巧(空指针错误)
  10. jq ajax传递json对象到服务端及contentType的用法