• 获取的文件位置
  • 获取内部文件也就是只能供自己使用的文件
  • 获取外部文件也就是可以供其他程序一起使用的文件
  • 为类的每个对象创建获取自己对应图片的文件名称的方法
  • 拍照


获取的文件位置

获取内部文件,也就是只能供自己使用的文件

  • File getFilesDir()
    获取/data/data/packagename/files目录
  • FileInputStream openFileInput(String name)
    打开现有文件进行读取;name指定文件,不能添加路径
  • FileOutputStream openFileOutput(String name, int mode)
    打开现有文件进行写入,不存在就创建;name指定文件,不能添加路径;默认创建在files目录下
  • File getDir(String name, int mode)
    获取/data/data/packagename/自定义目录,没有就创建;name为自定义目录名
  • String[] fileList()
    获取/data/data/packagename/files目录下的文件列表,可以配合open方法进行操作
  • File getCacheDir()
    获取/data/data/packagename/cache目录;需要即时清理

mode的4种模式:
Context.MODE_PRIVATE 私有化,并且覆盖原内容
Context.APPEND 追加
Context.MODE_WORLD_READABLE 可读
Context.MODE_WORLD_WRITEABLE 可写

获取外部文件,也就是可以供其他程序一起使用的文件

  • File getExternalCacheDir()
    获取主外部储存上的缓存文件目录;同样需要即时清理
  • File[] getExternalCacheDirs()
    获取多个外部储存上的缓存文件目录
  • File getExternalFilesDir(String str)
    获取主外部储存上存放常规文件的文件目录;str指定特定内容类型的子目录;特定类型用DIRECTORY_为前缀,定义在Environment中,比如Environment.DIRECTORY_PICTURES,换句话说,外部储存有对文件进行分类,而内部储存没有
  • File[] getExternalFilesDirs(String str)
    获取主外部储存上指定类型的所有文件目录
  • File[] getExternalMediaDirs()
    获取Android储存图片、视频和音乐文件的所有外部文件目录;无需指明文件类型,只要是图片、视频和音乐类型的多媒体文件目录就可以获取

为类的每个对象创建获取自己对应图片的文件名称的方法

比如:

public String getPhotoFilename(){
    return "IMG_" + getId().toString() + ".jpg";
}

获取添加了文件的指定目录路径
比如:

public File getPhotoFile(NoteBody noteBody){
    File externalFilesDir = mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    if (externalFilesDir == null){
        return null;
    }
    return new File(externalFilesDir, noteBody.getPhotoFilename());
}

记得添加权限

拍照

触发拍照很容易,使用定义在MediaStore里的ACTION_IMAGE_CAPTURE创建Intent,用Intent隐式响应就可以了。
如何让拍照获得的图片保存到我们指定的目录下的文件里呢?
1.创建指定储存目录和文件名称的File对象;
2.用File对象创建Uri;
3.创建开启拍照的隐式intent;
4.将Uri储存进intent里,指定的key为MediaStore.EXTRA_OUTPUT;
5.用startAcitivyForResult开启拍照;
6.在onActivityResult里判断处理,比如读取文件里的照片并显示出来。

拍照需要考虑一种情况,就是手机是否具有拍照功能,可以在manifest文件里进行硬件的声明:

<uses-feature android:name = "android.hardware.camera"
              android:required = "false" />