csdn的朋友大家好,这是我在csdn的第一篇博文,工作已有三四年之久,却一直对写博客和大家分享工作经验这块有欠缺,从今天起要把之前做的不足的弥补一下,同时要向社区里一直和大家分享经验的前辈、同仁学习致敬!好了 闲话不多说了,开始正题...
先和大家分享一下刚遇到的一个问题的解决办法吧,这几天一直在给小米盒子、tv做产品适配,其中我们的app中有一个连带打包的db文件,位于res/raw目录下,
这个数据库在应用启动后会使用,使用时需要将这个db文件copy到文件系统上形成一个独立的dbFile,然后通过类似
<span style="font-size:14px;">SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE);</span>
的代码就可以打开db文件了,我先后在平板和一些其他的盒子类产品上调试后,都没有遇到问题,唯独在小米盒子一代上调试的时候发现这个数据库copy的动作完不成,一个外部存储空间的挂在状态也是mounted的状态,可就是创建文件不成功,真是坑**啊,但是如果是设备的存储空间不可用或是sdcard不是挂载状态的话,那么这个copy db file的动作就不能完成了,那么这时候如何将数据库打开使用呢?
注:要在android设备上写sdcard的话需要在manifest.xml文件中声明写存储空间的权限:
<span style="font-size:14px;"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></span>
通过调研发现,android提供了一个可以创建private file的方法->
<span style="font-size:14px;">Context.openFileOutput(“file_name”, MODE);</span>
通过查看api,可以得知该方法直接创建一个和当前应用相关的私有文件,并打开一个文件输出流对象供写入内容使用。这样一来就可解决这个copy file from apk to file system了,该api具体如下:
FileOutputStreamandroid.content.Context.openFileOutput(String name, int mode) throws FileNotFoundException
Open a private file associated with this Context's application package for writing. Creates the file if it doesn't already exist.
-
Parameters:
- name The name of the file to open; can not contain path separators.
-
mode Operating mode. Use 0 or
MODE_PRIVATE
for the default operation,MODE_APPEND
to append to an existing file,MODE_WORLD_READABLE
andMODE_WORLD_WRITEABLE
to control permissions.
Returns:
- FileOutputStream Resulting output stream. Throws:
- FileNotFoundException
创建的private路径通过
<span style="font-size:14px;">context.getFilesDir().getAbsolutePath();</span>
来获得,具体的api如下:
Fileandroid.content.Context.getFilesDir()
Returns the absolute path to the directory on the filesystem where files created withopenFileOutput
are stored.
-
Returns:
- Returns the path of the directory holding application files. See Also:
- openFileOutput
- getFileStreamPath
- getDir
通过打印log,可以得知其实这个和应用相关的file是位于/data/data/com.your/package/files目录之下,类似的可供使用的目录还有/data/data/com.your.package/cache,不过该目录下创建的文件在用户执行清空缓存的时候会被情况,因此如果是创建一些临时的file可以保存到该目录下,不过该目录在执行写入操作的时候需要提升一下权限,可以通过
<span style="font-size:14px;">String cmd = "chmod 777 " + cacheFile.getAbsolutePath();
Runtime.getRuntime().exec(cmd);
</span>
来实现,笔者之前在实现应用检测升级下载安装包的时候就通过这种方式保存过临时的apk文件。
好了,以上是两种在sdcard不可用时创建file的方法,希望可以帮助到遇到同样问题的网友。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
分享是一件快乐的事儿!~