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