当前位置:   article > 正文

Android多媒体功能开发(4)——调用系统Activity拍照、选择图片、查看图片、裁剪图片_android 通过intent 调用系统相机

android 通过intent 调用系统相机

一、拍照

拍照界面就是调用系统照相机,动作为MediaStore.ACTION_IMAGE_CAPTURE。生成的照片有三种返回方式:

  • 在调用拍照应用的Intent中通过EXTRA_OUTPUT属性设定存放照片的文件。
  • 调用时不指定目标文件,在返回的Intent中包含图片的Uri,再从MediaStore中获得文件位置等信息。
  • 不生成图片文件,返回Bitmap格式的点阵数据,放在Intent的Extras部分。应用根据需要处理结果:通过Uri可以获得照片点阵,点阵也可存入文件

具体的打开拍照界面的代码如下:

  1. File path = new File(getExternalFilesDir(null),"test/"); // 值为Android/data/<package-name>/files/test/
  2. if(!path.exists())path.mkdirs()); // 创建目录
  3. photoFile = new File(path, "photo.jpeg"); // 目标文件
  4. if(Build.VERSION.SDK_INT>=24){
  5. fileProviderAuthority = getPackageName() + ".fileProvider";
  6. // 格式为:content://com.zzk.a1501systemactivity.fileProvider/testdir/audio.aac,
  7. // testdir是res/file_paths/file_paths.xml中定义的目录别名
  8. photoUri = FileProvider.getUriForFile(MainActivity.this, fileProviderAuthority, photoFile);
  9. } else { // Android 7 以前可以直接在intent中向其他应用分享文件
  10. photoUri = Uri.fromFile(photoFile);
  11. }
  12. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 拍照动作
  13. if(photoFile.exists()) photoFile.delete(); // 若保存照片的文件存在,先删除
  14. intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); // 拍摄的照片保存到photoUri指定的文件
  15. intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // 授予对方写该文件的权限
  16. startActivityForResult(intent, TAKE_PHOTO);

代码中先为存放结果的照片文件创建一个photoUri,根据SDK版本需要分“file://”和FileProvider两种格式,实际文件保存在应用的文件目录下的test子目录中。然后用MediaStore.ACTION_IMAGE_CAPTURE动作生成一个Intent,再通过Intent的MediaStore.EXTRA_OUTPUT属性,设置生成的照片保存到photoUri指定的文件。授予写文件权限后,启动拍照界面。

拍照完成后,会调用主活动的onActivityResult方法,应用可以在该方法中需要对新拍的照片进行处理。因为调用时的Intent中指定了目标文件,所以拍摄的照片已经存放在该文件中。举个例子,可以将该图片显示到了界面上的ImageView组件,代码如下:

  1. Uri uri = Uri.fromFile(photoFile); // 目标文件的uri
  2. Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); // 目标文件载入为Bitmap
  3. 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对象保存到需要的文件。通过这两个步骤,可以把选中的图片拷贝到指定的位置。

具体的调用选择图片界面的代码如下:

  1. Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  2. intent.setType(“image/*");
  3. startActivityForResult(intent, PICK_PHOTO);

调用后打开选择图片界面:

选择图片返回一个已有的图片,所以一般将文件复制到需要的目录。返回的Intent中有选中图片的uri,通过该uri可以将图片载入为Bitmap对象,然后再将该Bitmap对象可以保存到需要的位置。主要代码为:

  1. Uri uri = data.getData(); // 从intent中获取选中文件的uri
  2. Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); // 载入为Bitmap对象
  3. 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两种格式。具体代码如下:

  1. Intent intent = new Intent(Intent.ACTION_VIEW); // 查看文件动作
  2. intent.setDataAndType(photoUri, "image/*"); // 要查看的图片由photoUri指定,类型为图片
  3. intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 授予对方读取该文件的权限
  4. startActivity(intent); // 调用图片查看应用

调用后,如果系统中有多个应用可以查看图片,会弹出一个选择界面。选择“相册”应用后,会用该应用打开图片。

查看图片没有返回信息需要处理。

四、图片裁剪

裁剪图片的界面通过动作“com.android.camera.action.CROP”调用。有些设备上,在调用拍照或选择照片界面时,设置”crop”参数为”true”,拍照或选择照片完成后也会自动进入裁剪界面,但不是所有设备都支持。

要裁剪的原始图片用一个uri指定,分“file://”和FileProvider两种格式,具体可以参照前面拍照部分的代码。裁剪后的图片保存到一个文件,可以直接用文件uri的格式指定,不需要用FileProvider。输出Uri不能和输入Uri是同一个文件。

具体代码如下:

  1. Intent intent = new Intent("com.android.camera.action.CROP"); // 裁剪图片动作
  2. intent.setDataAndType(photoUri, "image/*"); // 要裁剪的文件由photoUri指定
  3. intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 授予对方读取该文件的权限
  4. intent.putExtra("scale", true);
  5. intent.putExtra("return-data", false); // 不返回bitmap,而是输出到output参数中的uri指定的文件
  6. Uri uriCroped = Uri.fromFile(cropedPhotoFile); // 输出文件不用FileProvider
  7. intent.putExtra(MediaStore.EXTRA_OUTPUT, uriCroped);
  8. startActivityForResult(intent, CROP_PHOTO);

打开的裁剪界面是这样的:

返回后的处理流程和拍照相同,将裁剪后的图片显示到界面的ImageView中。主要代码如下:

  1. Uri uri = Uri.fromFile(cropedPhotoFile); // 裁剪后文件的uri
  2. Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); // 目标文件载入为Bitmap
  3. photoView.setImageBitmap(image); // 设置到界面的ImageView组件显示

完整代码下载:

Android多媒体功能开发-调用系统Activity的例子

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/175280
推荐阅读
相关标签
  

闽ICP备14008679号