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

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

今天由于app的需求我研究了下.如今分享下.app

其实不管是经过拍照仍是从相册选取都会用到Intentide

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

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

咱们能够点击头像或者一个按钮而后弹出一个对话框,让用户本身this

选择是拍照仍是选择图片(以下图)spa

.设计

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

//对头像操做
    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):blog

/** * 拍照获取图片 */
    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()的具体参数信息能够自行查文档或者百度.
相关文章
相关标签/搜索