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

来源:互联网 发布:旋转秋千知乎 编辑:程序博客网 时间: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
原创粉丝点击