Android实战一:更换头像

系列博客Android实战:方便大家快速集成到自己的项目中去

项目源码地址
http://download.csdn.net/detail/sinat_35615296/9886923


(1)效果演示

(2)主要流程

  1. 写了个BaseActivity内部封装了,6.0动态权限的获取
  2. 底部的弹窗使用github三方库ActionSheet实现(https://github.com/baoyongzhang/android-ActionSheet
  3. 打开相机拍摄后传入一个图片地址,方便我们以后取出这个图片文件
  4. 打开相册后选取图片后,我们会把获取到的url转换成图片的地址
  5. 最后,根据图片的路径,使用BitmapUtils工具类压缩一下图片显示到UI上

演示核心代码

public class MainActivity extends BaseActivity implements View.OnClickListener {

    /**
     * UI
     */
    private ImageView imageView;
    private Button changePhotoBtn;

    /**
     * DATA
     */
    // 拍照回调
    private static final int PHOTO_REQUEST_CAREMA = 1;
    // 相册回调
    private static final int PHOTO_REQUEST_GALLERY = 2;
    //保存拍摄相片的文件路径
    private static String PHOTO_FILE_DICTIONARY;
    //保存拍摄相片的名字
    private static final String PHOTO_FILE_NAME = "photo.png";
    //保存拍摄相片的File
    private File tempFile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        changePhotoBtn = ((Button) findViewById(R.id.changeAvator));
        changePhotoBtn.setOnClickListener(this);

        imageView = ((ImageView) findViewById(R.id.image));
    }


    /**
     * 1 拍摄或者相册
     */
    @Override
    public void onClick(View v) {
        setTheme(R.style.ActionSheetStyleiOS7);
        ActionSheet.createBuilder(this,getSupportFragmentManager())
                .setOtherButtonTitles("拍摄","从手机相册中选择")
                .setCancelButtonTitle("取消")
                .setCancelableOnTouchOutside(true)
                .setListener(new ActionSheet.ActionSheetListener() {
                    @Override
                    public void onDismiss(ActionSheet actionSheet, boolean isCancel) {

                    }

                    @Override
                    public void onOtherButtonClick(ActionSheet actionSheet, int index) {
                        if (index == 0){
                            startCamera();
                        }else {
                            startGalary();
                        }
                    }
                })
                .show();
    }

    /**
     * 2-1 相册选取
     */
    private void startGalary() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
    }

    /**
     * 2-2 相机上传
     */
    private void startCamera() {

        //保存相机拍摄图片的临时文件
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {
            //相片父路径
            PHOTO_FILE_DICTIONARY = this.getExternalFilesDir(null).getAbsolutePath();
            tempFile = new File(PHOTO_FILE_DICTIONARY, PHOTO_FILE_NAME);
            tempFile.delete();
            if (!tempFile.exists()) {
                try {
                    tempFile.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplication(), "照片创建失败!", Toast.LENGTH_LONG).show();
                    return;
                }
            }
            //打开相机
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            //传入需要保存
            Uri uri = Uri.fromFile(tempFile);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
        } else {
            Toast.makeText(getApplication(), "sdcard无效或没有插入!", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 3 拍摄上传/相册选取的回调 得到相机/相册的图片路径
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        /**
         * 相机拍摄回调
         */
        if (requestCode == PHOTO_REQUEST_CAREMA && resultCode == RESULT_OK) {
            Toast.makeText(getApplication(), "相机拍摄回调!", Toast.LENGTH_SHORT).show();

            //此方法获取到的是拍摄的原图,比较大
            if (tempFile != null && tempFile.exists()) {
                displayBitmap(tempFile.getAbsolutePath());

            }
        }

        /**
         * 相册选取回调
         */
        if (requestCode == PHOTO_REQUEST_GALLERY && resultCode == RESULT_OK && data != null) {
            Toast.makeText(getApplication(), "相册选取回调!", Toast.LENGTH_SHORT).show();

            /**
             * 方式0 通过Uri获取到图片文件的地址
             */
            Uri uri = data.getData();
            if (uri != null) {
                String filePathFromUri = getFilePathFromUri(MainActivity.this, uri);
                displayBitmap(filePathFromUri);

            }

        }
    }

    /**
     * 4 根据回调路径,压缩图片仿OOM,最后展示图片
     */
    private void displayBitmap(String imgPath) {
        Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(imgPath, 480, 800);
        imageView.setImageBitmap(bitmap);
    }

    /**
     * 把图片的Uri转换成图片路径
     */
    public static String getFilePathFromUri(final Context context, final Uri uri) {
        if (null == uri) return null;
        final String scheme = uri.getScheme();
        String data = null;
        if (scheme == null)
            data = uri.getPath();
        else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
            data = uri.getPath();
        } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
            Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
            if (null != cursor) {
                if (cursor.moveToFirst()) {
                    int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                    if (index > -1) {
                        data = cursor.getString(index);
                    }
                }
                cursor.close();
            }
        }
        return data;
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码充电宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值