今天在测试android拍照功能时遇到一个困惑:照片拍成功了,程序能都能读取到,但是在手机储存中怎么也找不到拍的照片。先将学习过程中经过的曲折过程记录如下:

  一:拍照并保持

  通过调用android 的Camera接口,拍照片,在回调接口中保存图片:

  

public void onPictureTaken(byte[] bytes, Camera camera) {
  // 定义文件名
  Date date = new Date();
  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmssSS");
  String fileName = dateFormat.format(date)+".jpg";
  FileOutputStream os = null;
  boolean success = true;
  try{     // 保存到内部储存
    os = getActivity().openFileOutput(path, Context.MODE_PRIVATE);
    os.write(bytes);   }catch (IOException e){
  success = false;
  Log.e(TAG, "Error writing to file " + fileName, e);
}

原来此次调用的:getActivity().openFileOutput(path, Context.MODE_PRIVATE);是把文件储存到了APP的私有储存中的/data/data/...app包路径/file 中了,这个私有目录是不能被外部访问的,所以在手机储存中肯定看不到。

二:该为储存到外部储存

  public void onPictureTaken(byte[] bytes, Camera camera) {
// 定义文件名
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmssSS");
String fileName = dateFormat.format(date)+".jpg";
FileOutputStream os = null;
boolean success = true;
try{ File path = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
File file = new File(path, fileName); path.mkdirs(); if (path.exists()){
os = new FileOutputStream(file);
}else {
Log.e(TAG,"Create path failed");
return;
}
// 保存到内部储存 os.write(bytes); }catch (IOException e){
success = false;
Log.e(TAG, "Error writing to file " + fileName, e);
}

向外部储存读写文件需要申请权限,在app配置文件中增加如下权限:

  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

好了,文件保存成功了,但是还是在手机储存中看不到,为什么?

原来,android储存中新增文件,并不能及时刷新储存目录,需要重启手机或者通过代码手动刷新目录。手动刷新目录经过我测试的有以下两种方式:

1.发广播

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getAbsolutePath().toString())));

其中第二个参数指的是保存文件的绝对路径

2.MediaScannerConnection

MediaScannerConnection.scanFile(getActivity(), new String[]{file.getAbsolutePath().toString()}, null, null);

三:总结

Android的储存分为app私有储存和外部储存。app私有储存是不可以被其他app访问的。外部储存是可以被其他app共享的。外部储存并不是指SD卡储存,也包括手机自身的储存空间。

关于android存储的更多相关文章

  1. Android存储访问及目录

    Android存储访问及目录 Android的外部存储 Android支持外部存储(case-insensitive filesystem with immutable POSIX permissio ...

  2. Android存储之SQLite数据库

    Android存储之SQLite数据库数据库 创建数据库 package --; import android.content.Context; import android.database.sql ...

  3. Android存储路径你了解多少?

    在了解存储路径之前,先来看看Android QQ的文件管理界面,了解一下QQ的数据文件路径来源,到底是来源于什么地方? 手Q文件管理对应存储目录 我的文件:是指放在QQ指定目录下的文件:/tencen ...

  4. Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)

    本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...

  5. 一篇文章搞懂android存储目录结构

    前言 前两天因为开发一个app更新的功能,我将从服务器下载的apk文件放在了内部存储目录(测试手机为小米,路径为:data/user/0/packagename/files)下面,然后安装的时候一直安 ...

  6. android存储方式的应用场景

    作为一个完整的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.文件存储.SQLite. Content Provider ...

  7. Android开发学习——android存储

    Android的存储 内部存储空间RAM内存:运行内存,相当于电脑的内存ROM内存:存储内存,相当于电脑的硬盘外部存储空间 SD卡:相当于电脑的移动硬盘    * 2.2之前,sd卡路径:sdcard ...

  8. Android存储

    Android的四种数据存储方式: 1.SharedPrefrences 2.SQLite 3.Content Provider 4.File SharedPrefrences: 1.是一种轻型的数据 ...

  9. 利用反射得到android存储路径

    获得android手机的存储路径: public String getPrimaryStoragePath(){ try{ StorageManager sm = (StorageManager) c ...

  10. android 存储

    总共四种:SharedPreferences,文件存储,SQLite数据库,ContentProvider,网络存储 1.sharedPreferences:适合存储少量数据,而且存取的格式简单,采用 ...

随机推荐

  1. MVP 个人理解2

    根据我的理解,画了个图 这次又看了下 较复杂点的例子. 往往一个项目有多个部份,我们可以按功能分成几个activity, 每个activity有自己的view和数据model,因此也有自己的逻辑 pr ...

  2. 日期转换时Safari中返回Invalid Date

    问题: 进行日期转换时,Safari中会返回Invalid Date, 而IE 9, Firefox, Chrome and Opera显示正常,代码如下所示: var d = new Date(&q ...

  3. redis初步入门

    http://blog.csdn.net/u014419512/article/details/25693425 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] 环境 安装 ...

  4. css知识点积累

    关于样式的优先级问题: !important > style > [ id > class > tag ];  z-index 的属性用法: z-index属性是用来设置元素的 ...

  5. alter table的用法

    在数据库开发过程中,除了用得最多的数据库查询外,我们有时也需要去修改数据表的定义,比如在已存在的数据表中新增列和删除列等.这篇文章就总结一下alter table语句的用法. 示例代码如下. USE ...

  6. 分享记录我的Linux系统入门学习经验

    人生很多事情都是巧合,或者说命中注定.就拿Linux于我来说,大学期间也修了Linux基础这门课,但是从来没有想到自己会从事与Linux相关的工作,更没有想过自己可以通过Linux获取更多的东西. 真 ...

  7. 关于PDF文件无法打印的问题的解决办法

    在这里用到一个软件 PDFSpliter可以直接在网上下载.下载安装完之后 1:打开软件 2,点击   PDF合并  按钮 3,找到无法打印的文件 4,单击开始,文件另存为 5,另存为后的文件就可以打 ...

  8. 全真模拟 (1) day1

    第一题: 题目大意: 给出N个数的m对关系(a,b)表示a大于b. 每个数至少为100,求这些书最小可能的和. 解题过程: 1.看到这题就想到之前USACO的一道题,那题是N头牛排序,然后给出m对关系 ...

  9. linux下各种软件的安装过程

    //////知识储备//////////////////////////////////////////////////////////////////// /var 下存放着服务和经常改变的文件 / ...

  10. Ubuntu下部分文件操作的命令

    (1)创建目录 mkdir filefoldname (2)删除空目录 rmdir filefoldname (3)删除非空目录及其中所有文件 rm -rf filefoldname (4)移动文件或 ...