• Android 拍照或者从相册获取图片的实现


    我们常常会用到上传头像,或者发帖子的时候选择本地图片上传的功能.这个很常见

    今天因为app的需求我研究了下.现在分享下.

    其实不论是通过拍照还是从相册选取都会用到Intent

    这是系统提供给我们用来调用系统方法的好用工具!

    首先,需要设计下我们想怎么调用系统的拍照或者选取图片的方法

    我们可以点击头像或者一个按钮然后弹出一个对话框,让用户自己

    选择是拍照还是选择图片(如下图)

    .

    那这个对话框怎么写呢.通过AlertDialog来实现(我们就给这个方法起名叫dialog):

    //对头像操作
        private void dialog() {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("提示");
            builder.setMessage("请选择修改头像方式");
    
            //调用相机拍照
            builder.setPositiveButton("拍照", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    takePhoto();
                }
            });
            //从相册里面取照片
            builder.setNegativeButton("相册", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    pickPhoto();
                }
            });
            builder.create().show();
        }

    然后就要实现拍照和相册选择功能(通过intent):

    /**
         * 拍照获取图片
         */
        private void takePhoto() {
            //执行拍照前,应该先判断SD卡是否存在
            String SDState = Environment.getExternalStorageState();
            if (SDState.equals(Environment.MEDIA_MOUNTED)) {
    
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//"android.media.action.IMAGE_CAPTURE"
                /***
                 * 需要说明一下,以下操作使用照相机拍照,拍照后的图片会存放在相册中的
                 * 这里使用的这种方式有一个好处就是获取的图片是拍照后的原图
                 * 如果不实用ContentValues存放照片路径的话,拍照后获取的图片为缩略图不清晰
                 */
                ContentValues values = new ContentValues();
                photoUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
               // intent.putExtra("uri" , photoUri);
                /**-----------------*/
                startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);
            } else {
                Toast.makeText(this, "内存卡不存在", Toast.LENGTH_LONG).show();
            }
        }
    
        /***
         * 从相册中取图片
         */
        private void pickPhoto() {
            //AndroidImagePicker.getInstance().setSelectMode(AndroidImagePicker.Select_Mode.MODE_MULTI);
            Intent intent = new Intent(Intent.ACTION_PICK, null);
            //通过Intent 筛选所有的图片
            intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    
            startActivityForResult(intent, REQ_IMAGE);
        }
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);调用系统拍照的功能

      通过重写onActivityResult的方法获取通过

     startActivityForResult()传来的信息(主要是拍照图片的uri).

    获取该uri:
    Uri uri = data.getData();

    获取了uri后就可以给相应的控件设置背景.比如(是给页面设置背景):
    bt = MediaStore.Images.Media.getBitmap(this.getContentResolver() , uri);
    im.setImageBitmap(bt);

    bt是Bitmap类型im是ImageView类型并且已经绑定控件.



    在startActivityForResult()的参数中包含了(Intent data 改参数主要存放选中或者拍照的uri) 
    Intent intent = new Intent(Intent.ACTION_PICK, null);
    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    这两句就是调用系统图片选择的方法.同样通过
    startActivityForResult()传递参数

    startActivityForResult(Intent , int)
    这个方法与onActivityResult()配套使用
    它的第一个参数用来传递intetn信息 , 第二个参数是自己定义的常量用来唯一标识他的intent
    onActivityResult()的第二个参数即是这个唯一标识.第三个参数是intent信息.
    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK && requestCode == SELECT_PIC_BY_TACK_PHOTO) {
                String[] pojo = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE, MediaStore.Images.Media.SIZE};
                Cursor cursor = getContentResolver().query(photoUri, pojo, null, null, null);
                if (cursor != null) {
                    cursor.moveToFirst();
                    String picpath = cursor.getString(cursor.getColumnIndexOrThrow(pojo[0]));
                    ImageItem item = new ImageItem(
                            picpath
                            , cursor.getString(cursor.getColumnIndexOrThrow(pojo[1]))
                            , cursor.getInt(cursor.getColumnIndexOrThrow(pojo[2])));
                    if (picpath != null &&
                            (picpath.endsWith(".png") || picpath.endsWith(".PNG") || picpath.endsWith(".jpg"))) {
                        File file = new File(picpath);
                        Bitmap bt = BitmapFactory.decodeFile(picpath);
                        mText1.setText(picpath);
                        bt = getimage(picpath);
                        im.setImageBitmap(bt);
    
                    } else {
                        Toast.makeText(this, "选择图片文件不正确", Toast.LENGTH_LONG).show();
                    }
                    cursor.close();
                }
    
            } else {
                Bitmap bt = null;
                try {
                    Uri uri = data.getData();
                    mText1.setText(uri.toString());
                    bt = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
                    im.setImageBitmap(bt);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    就是这些.关于
    onActivityResult()的具体参数信息可以自行查文档或者百度.
  • 相关阅读:
    jQuery 基本选择器
    JavaScriptif while for switch流程控制 JS函数 内置对象
    JavaScrip基本语法
    数据库 存储引擎 表的操作 数值类型 时间类型 字符串类型 枚举集合 约束
    数据库基础知识 管理员 用户登录授权的操作
    粘包的产生原理 以及如何解决粘包问题
    socket TCP DPT 网络编程
    2018年年终总结
    Android技术分享
    No accelerator found
  • 原文地址:https://www.cnblogs.com/wobeinianqing/p/5492896.html
Copyright © 2020-2023  润新知