Android多媒体功能开发(4)——调用系统Activity拍照、选择图片、查看图片、裁剪图片
一、拍照
拍照界面就是调用系统照相机,动作为MediaStore.ACTION_IMAGE_CAPTURE。生成的照片有三种返回方式:
- 在调用拍照应用的Intent中通过EXTRA_OUTPUT属性设定存放照片的文件。
- 调用时不指定目标文件,在返回的Intent中包含图片的Uri,再从MediaStore中获得文件位置等信息。
- 不生成图片文件,返回Bitmap格式的点阵数据,放在Intent的Extras部分。应用根据需要处理结果:通过Uri可以获得照片点阵,点阵也可存入文件
具体的打开拍照界面的代码如下:
File path = new File(getExternalFilesDir(null),"test/"); // 值为Android/data/<package-name>/files/test/
if(!path.exists())path.mkdirs()); // 创建目录
photoFile = new File(path, "photo.jpeg"); // 目标文件
if(Build.VERSION.SDK_INT>=24){ fileProviderAuthority = getPackageName() + ".fileProvider"; // 格式为:content://com.zzk.a1501systemactivity.fileProvider/testdir/audio.aac, // testdir是res/file_paths/file_paths.xml中定义的目录别名photoUri = FileProvider.getUriForFile(MainActivity.this, fileProviderAuthority, photoFile);
} else { // Android 7 以前可以直接在intent中向其他应用分享文件photoUri = Uri.fromFile(photoFile);
}Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 拍照动作
if(photoFile.exists()) photoFile.delete(); // 若保存照片的文件存在,先删除
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); // 拍摄的照片保存到photoUri指定的文件
intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // 授予对方写该文件的权限
startActivityForResult(intent, TAKE_PHOTO);
代码中先为存放结果的照片文件创建一个photoUri,根据SDK版本需要分“file://”和FileProvider两种格式,实际文件保存在应用的文件目录下的test子目录中。然后用MediaStore.ACTION_IMAGE_CAPTURE动作生成一个Intent,再通过Intent的MediaStore.EXTRA_OUTPUT属性,设置生成的照片保存到photoUri指定的文件。授予写文件权限后,启动拍照界面。
拍照完成后,会调用主活动的onActivityResult方法,应用可以在该方法中需要对新拍的照片进行处理。因为调用时的Intent中指定了目标文件,所以拍摄的照片已经存放在该文件中。举个例子,可以将该图片显示到了界面上的ImageView组件,代码如下:
Uri uri = Uri.fromFile(photoFile); // 目标文件的uri
Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); // 目标文件载入为Bitmap
photoView.setImageBitmap(image); // 设置到界面的ImageView组件显示
代码中,MediaStore.Images.Media类用于操作MediaStore中的图片。方法static Bitmap getBitmap(ContentResolver cr, Uri url)返回url对应的图片的点阵。ImageView控件用于在界面上显示图片,对应于android.widget.ImageView类,主要方法为void setImageBitmap(Bitmap bm),设置图片内容。其参数为android.graphics.Bitmap类,是内存中保存的图片点阵。
二、选择图片
选择图片界面采用通用的文档选择动作Intent.ACTION_GET_CONTENT,只选择图片文件只需将类型设置为image/*。
返回结果的Intent中有选中图片的uri,通过该uri可以将图片载入为内存中的Bitmap对象,再将内存中的Bitmap对象保存到需要的文件。通过这两个步骤,可以把选中的图片拷贝到指定的位置。
具体的调用选择图片界面的代码如下:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(“image/*");
startActivityForResult(intent, PICK_PHOTO);
调用后打开选择图片界面:
选择图片返回一个已有的图片,所以一般将文件复制到需要的目录。返回的Intent中有选中图片的uri,通过该uri可以将图片载入为Bitmap对象,然后再将该Bitmap对象可以保存到需要的位置。主要代码为:
Uri uri = data.getData(); // 从intent中获取选中文件的uri
Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); // 载入为Bitmap对象
image.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); // 将Bitmap对象保存到需要的位置
代码中,Bitmap类的boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream)方法能够将点阵压缩并输出到流中。参数format为格式,取值为Bitmap.CompressFormat.JPEG或PNG。参数quality为质量,取值为0-100,0表示压缩文件最小,100表示图片质量最高,只对JPEG格式有效,PNG格式是无损压缩,相当于质量为100。参数stream为输出流,可以是文件。
三、图片查看
查看图片采用通用的文件查看动作Intent.ACTION_VIEW,将类型设置为image/*,并将要查看的图片文件以uri格式放入Data中。Uri分“file://”和FileProvider两种格式。具体代码如下:
Intent intent = new Intent(Intent.ACTION_VIEW); // 查看文件动作
intent.setDataAndType(photoUri, "image/*"); // 要查看的图片由photoUri指定,类型为图片
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 授予对方读取该文件的权限
startActivity(intent); // 调用图片查看应用
调用后,如果系统中有多个应用可以查看图片,会弹出一个选择界面。选择“相册”应用后,会用该应用打开图片。
查看图片没有返回信息需要处理。
四、图片裁剪
裁剪图片的界面通过动作“com.android.camera.action.CROP”调用。有些设备上,在调用拍照或选择照片界面时,设置”crop”参数为”true”,拍照或选择照片完成后也会自动进入裁剪界面,但不是所有设备都支持。
要裁剪的原始图片用一个uri指定,分“file://”和FileProvider两种格式,具体可以参照前面拍照部分的代码。裁剪后的图片保存到一个文件,可以直接用文件uri的格式指定,不需要用FileProvider。输出Uri不能和输入Uri是同一个文件。
具体代码如下:
Intent intent = new Intent("com.android.camera.action.CROP"); // 裁剪图片动作
intent.setDataAndType(photoUri, "image/*"); // 要裁剪的文件由photoUri指定
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 授予对方读取该文件的权限
intent.putExtra("scale", true);
intent.putExtra("return-data", false); // 不返回bitmap,而是输出到output参数中的uri指定的文件
Uri uriCroped = Uri.fromFile(cropedPhotoFile); // 输出文件不用FileProvider
intent.putExtra(MediaStore.EXTRA_OUTPUT, uriCroped);
startActivityForResult(intent, CROP_PHOTO);
打开的裁剪界面是这样的:
返回后的处理流程和拍照相同,将裁剪后的图片显示到界面的ImageView中。主要代码如下:
Uri uri = Uri.fromFile(cropedPhotoFile); // 裁剪后文件的uri
Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); // 目标文件载入为Bitmap
photoView.setImageBitmap(image); // 设置到界面的ImageView组件显示
Android多媒体功能开发(4)——调用系统Activity拍照、选择图片、查看图片、裁剪图片相关推荐
- Android多媒体功能开发(12)——使用Camera类拍照
Android上用摄像头拍照.录视频有两套API可用,Android5.0(API21)之前使用android.hardware.Camera类,之后推荐使用android.hardware.came ...
- Android多层嵌套Fragment中调用系统相机拍照以及裁剪的相关问题解决
多层嵌套Fragment中调用系统相机拍照.裁剪 最近公司项目有频繁使用相机拍照的需求,然后频繁的实际使用过程中遇到很多大大小小的坑,在此记录下. (ps.关于一些拍照后图片旋转.裁剪设置返回数据为t ...
- Android开发 :调用系统相机拍照保存照片并显示在当前界面
主要思路:调用照相机拍照,然后为拍得的照片在SD卡新开一个储存照片的文件,然后在onActivityResult中进行照片显示 1.因为要调用照相机和SD卡所以需要在manifest.xml中添加以下 ...
- Android多媒体功能开发(6)——使用MediaPlayer类播放音频
Android播放音频资源主要有两个类:MediaPlayer和SoundPool. MediaPlayer用于实现对一个音频的播放控制,侧重于启动.停止.暂停.位置控制等操作.不支持同时播放多个音频 ...
- Android多媒体功能开发(11)——使用AudioRecord类录制音频
AudioRecord类优点是能录制到缓冲区,能够实现边录边播(AudioRecord + AudioTrack)以及对音频的实时处理(如QQ电话).缺点是输出是PCM格式的原始采集数据,如果直接保存 ...
- Android调用系统的拍照,打开相册功能
Android调用系统的拍照,打开相册功能 1 添加权限: <!-- 往SDCard写入数据权限 --> <uses-permission android:name="an ...
- Android开发中调用系统窗口的方法
//直接拨号 Intent callIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678")); start ...
- 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.3节简析Android安装文件...
本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.3节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...
- 14.3.1 调用系统的拍照功能
14.3.1 调用系统的拍照功能 http://book.51cto.com 2010-06-22 14:19 李宁 中国水利水电出版社 我要评论(0) 摘要:<Android/OPho ...
最新文章
- 1 SQL server数据库基础
- jQuery的push
- Kotlin学习笔记(3)- 语法
- Scanner获取用户输入
- 工作242:关于第二个git仓库提交代码
- [转]Android Studio系列教程六--Gradle多渠道打包
- 了解 64 位 Office
- 适合于小团队且周期短的产品迭代的APP测试流程
- python描述性统计工作日上班时代码_基于Python的描述性统计实践
- Vue 插件开发与发布
- 电脑进入pe时蓝屏_进入PE系统就蓝屏怎么办?
- 前端——面试(苏小妍)
- 关于 360 度评估
- 摆脱“咖喱味”,让Win11的右键菜单回归经典
- pku_oj: W11-01 最大素数问题 (C++)
- 使用Xgboost自带的读取格式DMatrix()
- 计算机软件技术基础上机心得,计算机软件技术基础上机编程
- Sql注入基础原理介绍(超详细)
- 试读《3D打印:三维智能数字化创造》-超出我的想象
- 2020微信支付v3版本java对接详细流程