您的位置:首页 > 其它

调用系统摄像头和相册选择图片

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐