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

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

Android 拍照或者从相册获取图片的实现的更多相关文章

  1. android --拍照,从相册获取图片,兼容高版本,兼容小米手机

    前几天做项目中选择图片的过程中遇到高版本和小米手机出现无法选择和崩溃的问题,现在记录下来,后面出现同类问题,也好查找 1,定义常量: private static final int TAKE_PIC ...

  2. android 照相或从相册获取图片并裁剪

    照相或从相册获取图片并裁剪 在android应用中很多时候都要获取图片(例如获取用户的头像)就需要从用户手机上获取图片.可以直接照,也可以从用户SD卡上获取图片,但获取到的图片未必能达到要求.所以要对 ...

  3. Android拍照和从相册获取照片

    1.从相册获取照片 private void openAlumb() { //mRxPermissions:三方权限库 mRxPermissions .request(Manifest.permiss ...

  4. RN 使用第三方组件之react-native-image-picker(拍照/从相册获取图片)

    首先给个github地址:https://github.com/react-community/react-native-image-picker  英文不行的看下面这个笔记 该插件可以同时给iOS和 ...

  5. Android 拍照、从相册获取及裁剪的相关实现

    首先这些功能都是通过Intent去启动系统的服务去实现的,所以自然就有相应的Action.相关Actiong如下: 拍照——MediaStore.ACTION_IMAGE_CAPTURE (" ...

  6. Android相机、相册获取图片显示并保存到SD卡

    Android相机.相册获取图片显示并保存到SD卡 [复制链接]   电梯直达 楼主    发表于 2013-3-13 19:51:43 | 只看该作者 |只看大图  本帖最后由 happy小妖同学 ...

  7. iOS 从相机或相册获取图片并裁剪

    今天遇到一个用户头像上传的问题,需要从相册或者相机中读取图片.代码很简单,抽取关键部分,如下: //load user image - (void)UesrImageClicked { UIActio ...

  8. 简单的 Android 拍照并显示以及获取路径后上传

    简单的 Android 拍照并显示以及获取路径后上传 Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap ...

  9. android 拍照和从相册选择组件

    android 拍照及从相册选择组件 单独封装到一个 activity 中便于更好的复用 拍照或从相册选择成功后使用 EventBus 发出广播回传图片路径,和调用者充分解耦合 根据传入参数支持裁剪和 ...

随机推荐

  1. Python使用QRCode模块生成二维码

    QRCode官网https://pypi.python.org/pypi/qrcode/5.1 简介python-qrcode是个用来生成二维码图片的第三方模块,依赖于 PIL 模块和 qrcode ...

  2. UEFI安装Kali Linux 1.1.0记录

    现在使用Kali Linux 1.1.0, UEFI启动,使用Fcitx的拼音输入法,词库实在不爽,将就写一写. 本文地址: http://www.cnblogs.com/go2bed/p/42954 ...

  3. linux进程间通信-信号量(semaphore)

    一 为什么要使用信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问 代码的临界区域.临界区域是指执 ...

  4. stm32 USART rs485 rs232

    转载自:http://www.cnblogs.com/chineseboy/archive/2013/03/06/2947173.html 前题: 前段时间,在公司调试了一个项目,很简单,但对于初学的 ...

  5. SmartPointer Smar指针

    #include<iostream> using namespace std; // private class for use by HasPtr only class U_Ptr { ...

  6. 报表引擎API开发入门—简单程序数据集

    小编最近接的项目是有关报表开发的,很想把这部分知识分享出来.希望大家能够支持我!不多说,马上进入我们今天的话题. API基本知识 小编最近项目所做的是关于一个报表软件—FineReport报表开发的一 ...

  7. monkeyrunner之夜神模拟器的安装与使用(二)

    在上一篇文章-安卓开发环境搭建中,我们创建并启动了eclipse自带的安卓模拟器,该模拟器不仅启动慢,而且在使用过程中的反应速度也是出奇的差,经常出现卡机现象.为了解决这种现象,因此,我们又寻找到了更 ...

  8. 【原】js实现复制到剪贴板功能,兼容所有浏览器

    两天前听了一个H5的分享,会议上有一句话,非常有感触:不是你不能,而是你对自己的要求太低.很简单的一句话,相信很多事情不是大家做不到,真的是对自己的要求太低,如果对自己要求多一点,那么你取得的进步可能 ...

  9. UVa11549计算器谜题[floyd判圈]

    题意: 有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 白书上的题 set, ...

  10. HTML:图片热点 网页划区 表单

    图片热点: 划出图片中的区域,做超链接,点击该区域就可以直接跳转到链接网站 <img src="../../../3.jpg" title="血精灵" u ...