文档章节

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

我辈年轻1
 我辈年轻1
发布于 2016/11/03 19:22
字数 862
阅读 39
收藏 0

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

今天因为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()的具体参数信息可以自行查文档或者百度.

本文转载自:http://www.cnblogs.com/wobeinianqing/p/5492896.html

我辈年轻1
粉丝 1
博文 85
码字总数 0
作品 0
南京
程序员
私信 提问
Android大图片裁剪终极解决方案(中:从相册截图)

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/86853 在这篇博客中,我将向大家展示如何从相册截图。 ...

RyanHoo
2012/11/03
0
14
关于调用Android照相功能获取图片

最近在项目中调用相机,使用了别人写好的文件,但发现获取的照片没真正使用系统照相拍照再查看那么清晰,于是研究了一下,发现通常调用照相功能获取的图片都是被压缩的,如果要获取原照,那得...

tyronejw
2015/08/18
0
0
Android大图片裁剪解决方案

截图原理 在Android中,Intent触发Camera程序,拍好照片后,将会返回数据,但是考虑到内存问题,Camera不会将全尺寸的图像返回给调用的Activity,一般情况下,有可能返回的是缩略图,比如120...

今日竹石
2014/04/15
0
0
项目需求讨论 - WebView下拍照及图片选择功能

前言: 如果觉得掘金上看图片放大看不清楚,可以跳到另外的同步发布的链接看,放大图片下部有个可以查看原图功能,很清楚:项目需求讨论 - WebView下拍照及图片选择功能 现在很多app里面,都...

青蛙要fly
2018/06/23
0
0
Android-图片的选择,裁剪,压缩,适配高版本

趁着国庆有时间我们来聊一聊最常用的选取用户图片一系列的功能,go! 效果展示 效果展示链接 1.图片的选取 拍照 我们之前设置拍照保存的文件地址的Uri,都是直接Intent.putExtra(MediaStore.EX...

猴亮屏
01/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Leetcode PHP题解--D88 696. Count Binary Substrings

D88 696. Count Binary Substrings 题目链接 696. Count Binary Substrings 题目分析 给定一个01字符串,返回仅用连续的0和1串所能组成的二进制字符串个数。 例如,00110011,就包含0011,0...

skys215
8分钟前
0
0
基础工具类

package com.atguigu.util;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid......

architect刘源源
今天
43
0
P30 Pro劲敌!DxO官宣新机:排行榜又要变

5月26日晚间,DxOMark官方推特预告,将在5月27日公布一款新机型的DxOMark评分,猜猜是哪款? 网友猜想的机型有:红米K20、谷歌Pixel 3a、索尼Xperia 1、诺基亚9 PureView等。 DxOMark即将公布...

linux-tao
昨天
15
0
Ubuntu18.04.2窗口过小不能自适应(二次转载)

解决Ubuntu在虚拟机窗口不能自适应 2018年09月06日 16:20:08 起不了名儿 阅读数 855 此博文转载:https://blog.csdn.net/nuddlle/article/details/77994080(原地址) 试了很多办法这个好用 ...

tahiti_aa
昨天
2
0
死磕 java同步系列之CountDownLatch源码解析

问题 (1)CountDownLatch是什么? (2)CountDownLatch具有哪些特性? (3)CountDownLatch通常运用在什么场景中? (4)CountDownLatch的初始次数是否可以调整? 简介 CountDownLatch,可以...

彤哥读源码
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部