调用系统摄像头和相册选择图片
来源:互联网 发布:旋转秋千知乎 编辑:程序博客网 时间:2024/06/05 09:15
注:如果photoSaveName 有多级文件夹,一定要先mkdirs
package com.sf.cargoowner.ui.mine.settings.userinfo;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.text.TextUtils;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.RadioButton;import android.widget.Toast;import com.sf.cargoowner.R;import com.sf.cargoowner.base.SFBaseActivity;import com.sf.cargoowner.ui.mine.settings.userinfo.beans.UserInfo;import com.sf.cargoowner.utils.BitmapUtils;import com.sf.log.SFLog;import com.sf.sdk.widget.CircleImageView;import com.sf.toast.SFToast;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.InputStream;/** * Created by duxikuan on 2017/2/13. */public class UserInfoActivity extends SFBaseActivity implements UserInfoContract.View, View.OnClickListener { private UserInfoContract.Presenter presenter; private CircleImageView img_head; private EditText et_nick_name; private RadioButton rb_male; private RadioButton rb_female; private File picFile; private Uri cameraUri; private Uri localUri; private boolean isFromCamera;// 是否使用拍照方式 private boolean hasSelectedNewImg;// 是否选择了新的照片 private final int GET_FINAL_IMAGE = 0;// 得到最终的照片 private final int GET_IMAGE_FROM_CAMERA = 1;// 拍照方式 private final int GET_IMAGE_URI_FROM_LOCAL = 2;// 相册方式 private String nickName; private String sex; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user_info); initViews(); initDatas(); } private void initViews(){ initBackTitle(getString(R.string.user_info)); img_head = (CircleImageView) findViewById(R.id.img_head); img_head.setOnClickListener(this); et_nick_name = (EditText) findViewById(R.id.et_nick_name); rb_male = (RadioButton) findViewById(R.id.rb_male); rb_female = (RadioButton) findViewById(R.id.rb_female); Button btn_commit = (Button) findViewById(R.id.btn_commit); btn_commit.setOnClickListener(this); } private void initDatas() { presenter = new UserInfoPresenter(this, this); presenter.getUserInfo(); } @Override public void setPresenter(UserInfoContract.Presenter presenter) { this.presenter = presenter; } @Override public boolean isActive() { return false; } @Override public void showProgress() { showProgressDialog(); } @Override public void dismissProgress() { dismissProgressDialog(); } @Override public void showTip(String message) { } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_commit: nickName = et_nick_name.getText().toString(); if (TextUtils.isEmpty(nickName)) { SFToast.show(this, "昵称不能为空", Toast.LENGTH_SHORT); return; } sex = "1"; if (!rb_male.isChecked() && !rb_female.isChecked()) { SFToast.show(this, "请选择性别", Toast.LENGTH_SHORT); return; } if (rb_female.isChecked()) { sex = "0"; } if (hasSelectedNewImg) { File pictureFileDir = new File(Environment.getExternalStorageDirectory(), "/SF/Upload"); if (!pictureFileDir.exists()) { pictureFileDir.mkdirs(); } File realFile = new File(pictureFileDir, "head.jpeg"); if (realFile != null && realFile.exists() && realFile.length() > 0) { presenter.saveImage(realFile); } else { presenter.saveUserInfo(nickName, sex, null); } } else { presenter.saveUserInfo(nickName, sex, null); } break; case R.id.img_head: pickPhoto(); break; } } /** * 弹出选择图片的对话框 */ private void pickPhoto() { // 点击更换头像 final CharSequence[] items = {getString(R.string.photo_album), getString(R.string.take_photo)}; AlertDialog dlg = new AlertDialog.Builder(UserInfoActivity.this).setTitle(getString(R.string.select_photo)) .setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { // 这里item是根据选择的方式, 在items数组里面定义了两种方式,拍照的下标为1所以就调用拍照方法 if (item == 1) { doHandlerPhoto(GET_IMAGE_FROM_CAMERA); } else { doHandlerPhoto(GET_IMAGE_URI_FROM_LOCAL); } } }).create(); dlg.show(); } /** * 根据不同方式选择图片设置ImageView */ private void doHandlerPhoto(int type) { try { //保存裁剪后的图片文件 File pictureFileDir = new File(Environment.getExternalStorageDirectory(), "/SF/Upload"); if (!pictureFileDir.exists()) { pictureFileDir.mkdirs(); } picFile = new File(pictureFileDir, "head.jpeg"); if (picFile.exists()) { picFile.delete(); } picFile.createNewFile(); cameraUri = Uri.fromFile(picFile); if (type == GET_IMAGE_URI_FROM_LOCAL) { isFromCamera = false; // 选择本地图片并返回 Intent intent = new Intent(); intent.setType("image/*");//可选择图片视频 intent.setAction(Intent.ACTION_PICK); intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//使用以上这种模式,并添加以上两句 startActivityForResult(intent, GET_IMAGE_URI_FROM_LOCAL); } else { isFromCamera = true; // 拍照并返回 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri); startActivityForResult(cameraIntent, GET_IMAGE_FROM_CAMERA); } } catch (Exception e) { SFLog.i("HandlerPicError", "处理图片出现错误"); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case GET_IMAGE_FROM_CAMERA: // 从拍照返回 try { // 启用裁剪 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(cameraUri, "image/*"); setIntentParams(intent); startActivityForResult(intent, GET_FINAL_IMAGE); } catch (Exception e) { e.printStackTrace(); } break; case GET_IMAGE_URI_FROM_LOCAL: // 从相册返回图片uri Uri uri = data.getData(); try { if (uri != null) { // 启用裁剪 localUri = uri; Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(localUri, "image/*"); setIntentParams(intent); startActivityForResult(intent, GET_FINAL_IMAGE); } } catch (Exception e) { e.printStackTrace(); } break; case GET_FINAL_IMAGE: if (isFromCamera) { // 处理拍照的 try { if (cameraUri != null) { Bitmap bitmap = decodeUriAsBitmap(cameraUri); img_head.setImageBitmap(bitmap); hasSelectedNewImg = true;// 存了新图片了 } } catch (Exception e) { e.printStackTrace(); } } else { // 处理相册的 try { if (localUri != null) { Bitmap bitmap = decodeUriAsBitmap(localUri); if (bitmap != null) { // 这里是经过处理,防止内存溢出的bitmap,不能保存,否则会非常模糊 img_head.setImageBitmap(bitmap); // 并保存到本地 File pictureFileDir = new File(Environment.getExternalStorageDirectory(), "/SF/Upload"); if (!pictureFileDir.exists()) { pictureFileDir.mkdirs(); } picFile = new File(pictureFileDir, "head.jpeg"); if (picFile.exists()) { picFile.delete(); } picFile.createNewFile(); // 保存裁剪的图片(不压缩) FileOutputStream out = new FileOutputStream(picFile); InputStream inputStream = getContentResolver().openInputStream(localUri); int read = 0; byte[] buffer = new byte[1024]; while ((read = inputStream.read(buffer, 0, 1024)) != -1) { out.write(buffer, 0, read); } out.close(); inputStream.close(); hasSelectedNewImg = true;// 存了新图片了 } } } catch (Exception e) { e.printStackTrace(); } } break; } } } /** * 设置公用参数 */ private void setIntentParams(Intent intent) { intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 600); intent.putExtra("outputY", 600); intent.putExtra("noFaceDetection", true); // no face detection intent.putExtra("scale", true); intent.putExtra("scaleUpIfNeeded", true); intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); } /** * 根据uri获取bitmap * @param uri * @return */ private Bitmap decodeUriAsBitmap(Uri uri) { Bitmap bitmap = null; try { bitmap = BitmapUtils.getBitmapFromStream(getContentResolver().openInputStream(uri)); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } return bitmap; } @Override public void getUserInfoSuc(UserInfo userInfo) { if (!TextUtils.isEmpty(userInfo.getUserName())) { et_nick_name.setText(userInfo.getUserName()); } if (!TextUtils.isEmpty(userInfo.getSex())) { if (TextUtils.equals("1", userInfo.getSex())) { rb_male.setChecked(true); } else { rb_female.setChecked(true); } } if (!TextUtils.isEmpty(userInfo.getUserIcon())) { presenter.downloadIcon(userInfo.getUserIcon()); } } @Override public void onDownloadIconSuc(byte[] bytes) { // 图片下载成功,展示图片 if (bytes != null && bytes.length > 0) { img_head.setImageBitmap(BitmapUtils.getBitmapFromBytes(bytes)); } } @Override public void onSaveInfoSuc() { SFToast.show(this, "信息更新成功", Toast.LENGTH_SHORT); finish(); } @Override public void onSaveInfoFail(String msg) { SFToast.show(this, msg, Toast.LENGTH_SHORT); } @Override public void onSaveImageSuc(String img) { SFToast.show(this, "头像上传成功", Toast.LENGTH_SHORT); presenter.saveUserInfo(nickName, sex, img); } @Override public void onSaveImageFail(String msg) { SFToast.show(this, msg, Toast.LENGTH_SHORT); }}
0 0
- 调用系统摄像头和相册选择图片
- Android从相册选择图片和调用系统摄像头拍照
- 调用摄像头和相册(调用摄像头拍照和从相册中选择图片)
- 调用摄像头拍照和选择相册
- iOS调用系统相册和相机选择图片
- 调用摄像头和相册,从相册中选择(含有google发布的图片压缩以及自己的图片截取)
- ios 调用系统相册和摄像头
- 调用系统的相册和摄像头问题
- Android多媒体之调用摄像头和从本地相册中选择图片
- 【Android】调用系统相册选择图片
- 调用摄像头和相册
- 调用摄像头和相册
- 调用摄像头拍照和从相册中选择照片
- 调用摄像头拍照和从相册中选择
- Aandroid调用摄像头拍照和从相册选择照片
- 调用系统相机拍照和选择相册
- Android上传图片之调用系统拍照和从相册选择图片
- Android上传图片之调用系统拍照和从相册选择图片
- mac快捷键 xcode快捷键
- STM32按键程序
- 用svn服务器创建CocoaPods私有库的注意点
- 三次拉格朗日插值多项式
- 自动驾驶3-百度
- 调用系统摄像头和相册选择图片
- Linux 命令
- Android App的签名打包
- 百度搜索智能提示案例jsonp
- CCF 201604-3 路径解析 题解
- [BZOJ]1026: [SCOI2009]windy数
- 四轴PID讲解
- 在Java中如何高效的判断数组中是否包含某个元素
- SVM hinge loss / SoftMax cross entropy loss