zoukankan      html  css  js  c++  java
  • 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()的具体参数信息可以自行查文档或者百度.
  • 相关阅读:
    AE开发中Geometry到Polyline/Polygon的转换--转载
    asp.net MVC Views-----Controller传递数据方法
    百度翻译APi接口实现
    javascript添加删除行信息
    XMLDocument
    GDI绘制图像
    测试局域网内网络数据
    HL7 V2 分隔符
    IHE-PIX 备注
    数据库关键字 (Oracle, SQL Server, DB2)
  • 原文地址:https://www.cnblogs.com/wobeinianqing/p/5492896.html
Copyright © 2011-2022 走看看