赞
踩
一、拍照
拍照界面就是调用系统照相机,动作为MediaStore.ACTION_IMAGE_CAPTURE。生成的照片有三种返回方式:
具体的打开拍照界面的代码如下:
- 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组件显示
完整代码下载:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。