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多媒体功能开发-调用系统Activity的例子

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanoage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值