一、拍照

拍照界面就是调用系统照相机,动作为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拍照、选择图片、查看图片、裁剪图片相关推荐

  1. Android多媒体功能开发(12)——使用Camera类拍照

    Android上用摄像头拍照.录视频有两套API可用,Android5.0(API21)之前使用android.hardware.Camera类,之后推荐使用android.hardware.came ...

  2. Android多层嵌套Fragment中调用系统相机拍照以及裁剪的相关问题解决

    多层嵌套Fragment中调用系统相机拍照.裁剪 最近公司项目有频繁使用相机拍照的需求,然后频繁的实际使用过程中遇到很多大大小小的坑,在此记录下. (ps.关于一些拍照后图片旋转.裁剪设置返回数据为t ...

  3. Android开发 :调用系统相机拍照保存照片并显示在当前界面

    主要思路:调用照相机拍照,然后为拍得的照片在SD卡新开一个储存照片的文件,然后在onActivityResult中进行照片显示 1.因为要调用照相机和SD卡所以需要在manifest.xml中添加以下 ...

  4. Android多媒体功能开发(6)——使用MediaPlayer类播放音频

    Android播放音频资源主要有两个类:MediaPlayer和SoundPool. MediaPlayer用于实现对一个音频的播放控制,侧重于启动.停止.暂停.位置控制等操作.不支持同时播放多个音频 ...

  5. Android多媒体功能开发(11)——使用AudioRecord类录制音频

    AudioRecord类优点是能录制到缓冲区,能够实现边录边播(AudioRecord + AudioTrack)以及对音频的实时处理(如QQ电话).缺点是输出是PCM格式的原始采集数据,如果直接保存 ...

  6. Android调用系统的拍照,打开相册功能

    Android调用系统的拍照,打开相册功能 1 添加权限: <!-- 往SDCard写入数据权限 --> <uses-permission android:name="an ...

  7. Android开发中调用系统窗口的方法

    //直接拨号 Intent callIntent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:12345678")); start ...

  8. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.3节简析Android安装文件...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.3节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...

  9. 14.3.1 调用系统的拍照功能

    14.3.1 调用系统的拍照功能 http://book.51cto.com  2010-06-22 14:19  李宁  中国水利水电出版社  我要评论(0) 摘要:<Android/OPho ...

最新文章

  1. 1 SQL server数据库基础
  2. jQuery的push
  3. Kotlin学习笔记(3)- 语法
  4. Scanner获取用户输入
  5. 工作242:关于第二个git仓库提交代码
  6. [转]Android Studio系列教程六--Gradle多渠道打包
  7. 了解 64 位 Office
  8. 适合于小团队且周期短的产品迭代的APP测试流程
  9. python描述性统计工作日上班时代码_基于Python的描述性统计实践
  10. Vue 插件开发与发布
  11. 电脑进入pe时蓝屏_进入PE系统就蓝屏怎么办?
  12. 前端——面试(苏小妍)
  13. 关于 360 度评估
  14. 摆脱“咖喱味”,让Win11的右键菜单回归经典
  15. pku_oj: W11-01 最大素数问题 (C++)
  16. 使用Xgboost自带的读取格式DMatrix()
  17. 计算机软件技术基础上机心得,计算机软件技术基础上机编程
  18. Sql注入基础原理介绍(超详细)
  19. 试读《3D打印:三维智能数字化创造》-超出我的想象
  20. 2020微信支付v3版本java对接详细流程

热门文章

  1. 四川音乐学院计算机音乐创作,四川音乐学院学子斩获“中国大学生计算机设计大赛”9项等次奖...
  2. 主流卡尔曼滤波推导——KF、EKF、IKF、UKF、ESKF
  3. 微软OneDrive路线图:一张幻灯片胜过千言万语
  4. 医疗行业大数据分析有哪些应用
  5. Spring boot mybatis 打印SQL语句
  6. 即使没有翅膀,心。。。。。。也要飞翔
  7. 记录LostArk真实超级加速实现原理
  8. scala--快速了解Breeze
  9. 【学点Linux】linux和unix的区别以及 类Unix
  10. MATLAB自相关分析xcorr