Android编程权威指南(第二版)第十六章-使用intent拍照
POINT 1:(MARK先,经常用可能才记得住)
Context类提供的基本文件和目录处理方法:(存储的文件仅供应用内部使用)
File getFilesDir()
获取/data/data/<packagename>/files目录
FileInputStream openFileInput(String name)
打开现有文件进行读取
FileOutputStream openFileOutput(String name, int mode)
打开文件进行写入,如不存在就创建它
File getDir(String name, int mode)
获取/data/data/<packagename>/目录的子目录(如不存在就先创建它)
String[] fileList()
获取/data/data/<packagename>/files目录下的文件列表。
可与其他方法配合使用,例如openFileInput(String)
File getCacheDir()
获取/data/data/<packagename>/cache目录。应注意及时清理该目录,并节约使用空间
Context类提供的外部文件和目录处理方法:(公共文件,谨慎使用)
File getExternalCacheDir()
获取主外部存储上的缓存文件目录。用法类似getCacheDir()方法,但要注意, Android一般不会自动清理该目录
File[] getExternalCacheDirs()
获取多个外部存储上的缓存文件目录
File getExternalFilesDir(String)
获取主外部存储上存放常规文件的文件目录。通过String参数,可访问特定内容类型的子目录。
内容类型常量以DIRECTORY_为前缀,定义在Environment 中.
例如,用于图像文件的Environment.DIRECTORY_PICTURES
File[] getExternalFilesDirs(String)
类似getExternalFilesDir(String)方法,但该方法可获取指定类型的所有文件目录
File[] getExternalMediaDirs()
获取Android存储图片,视 频和音乐文件的所有外部文件目录.
getExternalMediaDirs和getExternalFilesDir(Environment.DIRECTORY_PICTURES)方法别在于调用该方法,多媒体扫描器会自动扫描目标目录,并将存放的多媒体文件暴露给能够播放音乐、浏览视频和图片的应用。也就是说,getExternalMediaDirs()方法返回目录中存放的任何文件都会自动出现在多媒体应用中
存储部分核心实例代码:
申请外部存储读写权限(AndroidManifest.xml)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="18"/>
maxSdkVersion属性规定:只有在API级别小于19的Android设备上,应用才需要这样的权限申请。WRITE_EXTERNAL_STORAGE写权限,调用的相机应用可以搞定这个权限。
从外部存储得到文件
File externalFilesDir = mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
if (externalFilesDir == null) {return null;}//效验外部存储是否可以使用
File file =new File(externalFilesDir, "file_name");//文件名要有属性后缀
调用相机应用:
MediaStore类定义了一些公共接口,可用于处理图像、视频以及音乐这些常见的多媒体任务。当然,这也包括触发相机应用的拍照intent。
ACTION_IMAGE_CAPTURE打开相机应用,默认只能拍摄缩略图这样的低分辨率照片,而且照片会保存在onActivityResult(...)返回的Intent对象里。
final Intent captureImage = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
boolean canTakePhoto = mPhotoFile != null &&captureImage.resolveActivity(packageManager) != null;
//是否有地方存储照片,以及检查设备上是否安装有相机应用
mButton.setEnabled(canTakePhoto);
if (canTakePhoto) {
Uri uri = Uri.fromFile("file_name");
captureImage.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//如果想要获得全尺寸照片,使用文件系统存储照片,存储在存储路径uri路径下
}
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivityForResult(captureImage, REQUEST_PHOTO);
}
});
<uses-feature android:name="android.hardware.camera" android:required="false"/>
uses-feature声明需要使用相机,设置了 android:required="false" 属性,Android系统就知道,尽管不带相机的设备会导致拍照功能缺失,但应用仍然可以正常安装和使用。

浙公网安备 33010602011771号