调用系统摄像头和相册选择图片
2016-11-28 13:43
295 查看
注:如果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); } }
相关文章推荐
- Android从相册选择图片和调用系统摄像头拍照
- 个人界面 < 头像 > 图片选择(相册,拍照)--如何调用系统的相册,裁剪并且上传
- Android 调用系统相册选择图片并显示
- Android调用系统摄像头和相册遇到大图片处理的解决方案
- Android调用系统相册和相机选择图片并显示在imageview中
- Android 调用系统相册选择图片并显示
- Android7.0调用系统相机拍照、相册选择图片、裁剪 图片压缩
- 调用摄像头和相册(调用摄像头拍照和从相册中选择图片)
- 调用Android系统摄像头进行拍照以及从图库选择图片
- iOS调用系统相册和相机选择图片
- Android 调用系统相机拍照(适配7.0)、从图库选择图片、从数据库读取联系人信息、相册图片、扫描文件
- Android调用系统相册选择图片,支持小米4云相册
- Android多媒体之调用摄像头和从本地相册中选择图片
- Android7.0调用系统相机拍照、相册选择图片、裁剪
- 一行代码完成 调用系统相册 和 视频,语音库,选择图片,视频,和音频文件。在选择界面实现了录制视频和录制音频功能。 截图
- 【Android】调用系统相册选择图片
- Android 调用系统相册选择图片并显示
- 调用系统图片库选择图片,调用摄像头拍摄图片保存图片,调用摄像头录像保存录像视频片段
- android2.3选择相册图片或者调用系统照相
- android2.3选择相册图片或者调用系统照相