关于android存储

  今天在测试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卡储存,也包括手机自身的储存空间。

时间: 2024-10-11 05:34:49

关于android存储的相关文章

Android存储子系统

这篇文章主要是分析Android存储向关联的一些模块,这个分析主要从大的工作流程和代码模块分析,没有对于没有分析到地方后续遇到后在详细分析.主要从以下几个模块分析 系统分区的挂载.外部分区挂载.Vold守候进程分.MountService的业务分析.Sdcard的详细分析.MTP模式分析和设备存储空间的监控机制. 系统分区挂载 Android是基于linux内核的系统,遵从linux的文件系统的挂载方式.在Android中在init进程负责挂载常用的system,data,cache等分区.In

Android 存储学习之在外部存储中读写文件

上节学习了如何在手机内部存储中读写文件,本节学习如何在手机的外部存储中读写文件.那就是如何在Sdcard中读写文件. 那我们还是用以前登录界面的例子举例说明,(登录界面请看上节Android 存储学习之在内部存储中读写文件) 先我们显示写的代码: 当点击确定并且自动登录的钩是选中的,则就会在sdcard文件夹写创建一个info.txt文件 public void login(View v) { String name = ed_nam.getText().toString(); String p

Android 存储学习之使用SharedPreference保存文件

上两节我们都是使用文本文件保存用户的信息,这明显是存在漏洞的.同时对文件中的内容不好管理.今天我们学习用SharedPreference保存.sharedPreference是专门保存一些比较零散的数据的. 我们还是用上节的例子分析,将用户的信息使用SharedPreference来保存. 注意:如果不知道是什么例子,请看Android 存储学习之在内部存储中读写文件 当点击确定按钮后,就会保存用户的信息: public void login(View v) { String name = ed

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

本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.com/JinBoy23520/CoderToDeveloperByTCLer 一丶慨述 本周的学习内容是Android存储,要求:数据库Sqlite相关操作,常用的文件存取方式,以及实用场景学习,主要学习Sqlite,SD卡文件操作,SharedPreference 二丶效果演示:         

Android存储的实现

在Android开发中,少不了对数据文件进行存取,需要掌握的Android存储功能技术如下: SharedPreferences:即用户偏好,可以通过这个类,存取一些简单的用户设置信息: 外部存储:即面向外部SD卡存取数据,可为数据做持久化保存: 内部存储:即面向移动设备内部自带存储区域的存取(并不是手机的CPU内存),同样可为数据做持久化保存,由于移动设备可能并未安装SD卡而且SD卡可能被随时取出,所以使用内部存储相对外部存储更加安全,但内部存储空间有限,远小于外部存储. SQLite数据库:

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

前言 前两天因为开发一个app更新的功能,我将从服务器下载的apk文件放在了内部存储目录(测试手机为小米,路径为:data/user/0/packagename/files)下面,然后安装的时候一直安装不了,提示解析包出错.后来查询发现,安装apk是调用了PackageInstaller,没有相关权限,这个无法获取内部路径,所以会安装不了.借机也复习了一遍Android下面存储相关的知识点,特来总结一番. 存储分类 对于Android存储目录,我总结成一张思维导图,如果有需要原图的,请在我的公众

Android 存储目录

Android 存储目录总结:https://www.jianshu.com/p/9528329d4787 Android内.外存储 易混淆点剖析(/mnt/sdcard./storage/sdcard0./storage/emulated/0等区别): https://blog.csdn.net/ITermeng/article/details/79423035 原文地址:https://www.cnblogs.com/pomodoro/p/12660460.html

android存储方式的应用场景

作为一个完整的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.文件存储.SQLite. Content Provider.对这几种方式的不同和应用场景整理如下.第一种: 使用SharedPreferences存储数据 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型.基本类型的值.比如应用程序的各种配置信息(如是否打开音效.是否使用震动效果.小游戏的玩家积分等),解锁口 令密码等 核心原理:保存基于XML

Android存储数据的8种方式

第一种:SharedPreferences 1.使用键值对的方式存储数据 2.通常用于:保存用户的偏好设置.选择是否保存密码.记录文档阅读的位置等 3.实现方式(写入): a).获取SharedPreferences对象     getSharedPreferences("文件名",MODE_PRIVATE/MODE_MULTI_PROCESS) 前者表示只能当前应用程序访问该文件:后者表示可以多个进程访问该文件:文件是存放在:data/data/<package name>

Android存储数据方式(转)

转自http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html   本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面将为大家一一详细介绍. 第一种: 使用Sha