安卓外部、内部存储文件操作

luoyjx · 2015-02-06 11:54 · 976次阅读

在android应用开发过程中多少会设计文件的读写,我遇到的场景就是,当我的应用崩溃时,我做一个全局的UncaughtExceptionHandler来捕捉异常并保存在错误日志中。

在脑袋里一想确实很容易,所以我之前就默认存在了sdcard中。

后来换了其他机器,发现目前好多手机都没有带sdcard或者没有安装。

那么生成的错误日志就无法正常写入文件了。

在网上查阅了一些资料补充完整了,给出代码:

/**
     * 保存错误信息到文件中
     *
     * @param ex
     * @return  返回文件名称,便于将文件传送到服务器
     */
    private String saveCrashInfo2File(Throwable ex) {

        StringBuffer sb = new StringBuffer();
        for (Map.Entry<String, String> entry : infos.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            sb.append(key + "=" + value + "\n");
        }
        Writer writer = new StringWriter();
        PrintWriter printWriter = new PrintWriter(writer);
        ex.printStackTrace(printWriter);
        Throwable cause = ex.getCause();
        while (cause != null) {
            cause.printStackTrace(printWriter);
            cause = cause.getCause();
        }
        printWriter.close();
        String result = writer.toString();
        sb.append(result);
        try {
            String filePath = "";
            long timestamp = System.currentTimeMillis();
            String time = formatter.format(new Date());
            String loggerDivider = "----------ERROR----" + time + "-" + timestamp + "--------------";

            //当存在外部存储时
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                filePath = Environment.getExternalStorageDirectory().toString();
            }else{//否则选用内部存储
                filePath = Environment.getDownloadCacheDirectory().toString();
            }
            File targetFile = new File(filePath + File.separator + DIR_NAME + File.separator + ERROR_FILE_NAME);
            if (!targetFile.exists()) {
                File dir = new File(targetFile.getParent());
                dir.mkdirs();
                targetFile.createNewFile();
            }
            RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");
            raf.seek(targetFile.length());
            raf.write(loggerDivider.getBytes());
            raf.write(sb.toString().getBytes());
            raf.close();
            return ERROR_FILE_NAME;
        } catch (Exception e) {
            Log.e(TAG, "an error occured while writing file...", e);
        }
        return null;
    }
收藏

暂无评论

登录后可以进行评论。没有账号?马上注册