3.2.1 简单地拍照
请求使用相机权限,这里是指令软件在 Google Play 中仅对有相机的设备可见。
当然有必要在使用相机之前通过调用
hasSystemFeature(PackageManager.FEATURE_CAMERA)
方法来检查设备上是否有相机。如果没有,我们应该禁用和相机相关的功能。
使用相机应用程序进行拍照
注意在调用startActivityForResult()方法之前,先调用resolveActivity(),这个方法会返回能处理该Intent的第一个Activity(译注:即检查有没有能处理这个Intent的Activity)。执行这个检查非常重要,因为如果在调用startActivityForResult()时,没有应用能处理你的Intent,应用将会崩溃。所以只要返回结果不为null,使用该Intent就是安全的。
这里区别于1.7.1里面的写法,这里面是返回能处理该 Intent 的第一个 Activity 。
获取缩略图
Android 的相机应用会把拍好的照片编码为缩小的 Bitmap ,使用 extra value 的方式添加到返回的 Intent 当中,并传递给 onActivityResult() 对应的 Key 为 “data” 。下面的代码展示的是如何获取这一图片并显示在 ImageView 上。
PS LinearLayout 默认排列方向为水平的。
Note: 这张从”data”中取出的缩略图适用于作为图标,但其他作用会比较有限。而处理一张全尺寸图片需要做更多的工作。
保存全尺寸照片
如果我们提供了一个 File 对象给 Android 的相机程序,它会保存这张全尺寸照片到给定的路径下。另外,我们必须提供存储图片所需要的含有后缀名形式的文件名。
一般而言,用户使用设备相机所拍摄的任何照片都应该被存放在设备的公共外部存储中,这样它们就能被所有的应用访问。将DIRECTORY_PICTURES作为参数,传递给getExternalStoragePublicDirectory()方法,可以返回适用于存储公共图片的目录。由于该方法提供的目录被所有应用共享,因此对该目录进行读写操作分别需要READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限。另外,因为写权限隐含了读权限,所以如果需要外部存储的写权限,那么仅仅需要请求一项权限就可以了:Note: 所有存储在getExternalFilesDir()提供的目录中的文件会在用户卸载你的app后被删除。
getExternalFilesDir 保存在内置存储的 Android 目录下
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
...
</manifest>
4.4开始不用申请权限
Environment.getExternalStoragePublicDirectory 方式,这是翻译版中的方式,需要申请权限,且照片保存在内置存储的 PICTURES 目录下面。
解码一幅缩放图片
private void setPic() {
// Get the dimensions of the View
int targetW = mImageView.getWidth();
int targetH = mImageView.getHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
mImageView.setImageBitmap(bitmap);
}