main
parent
e256162c17
commit
a0a6c1d2cf
@ -1,251 +0,0 @@
|
||||
package net.micode.notes.tool;
|
||||
|
||||
// 导入必要的类
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.os.Environment;
|
||||
import android.text.TextUtils;
|
||||
import android.text.format.DateFormat;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
|
||||
// 备份工具类
|
||||
public class BackupUtils {
|
||||
private static final String TAG = "BackupUtils";
|
||||
|
||||
// 单例实例
|
||||
private static BackupUtils sInstance;
|
||||
|
||||
// 获取实例的静态方法,确保在整个应用程序中只有一个实例存在
|
||||
public static synchronized BackupUtils getInstance(Context context) {
|
||||
if (sInstance == null) {
|
||||
sInstance = new BackupUtils(context);
|
||||
}
|
||||
return sInstance;
|
||||
}
|
||||
|
||||
// 数据导出类
|
||||
private TextExport mTextExport;
|
||||
|
||||
// 私有构造函数
|
||||
private BackupUtils(Context context) {
|
||||
mTextExport = new TextExport(context);
|
||||
}
|
||||
|
||||
// 检查外部存储是否可用
|
||||
private static boolean externalStorageAvailable() {
|
||||
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
|
||||
}
|
||||
|
||||
// 导出数据到文本文件
|
||||
public int exportToText() {
|
||||
return mTextExport.exportToText();
|
||||
}
|
||||
|
||||
// 获取导出的文本文件名
|
||||
public String getExportedTextFileName() {
|
||||
return mTextExport.mFileName;
|
||||
}
|
||||
|
||||
// 获取导出的文本文件目录
|
||||
public String getExportedTextFileDir() {
|
||||
return mTextExport.mFileDirectory;
|
||||
}
|
||||
|
||||
// 内部私有类,负责文本导出功能
|
||||
private static class TextExport {
|
||||
// 笔记和数据表的投影
|
||||
private static final String[] NOTE_PROJECTION = {
|
||||
NoteColumns.ID,
|
||||
NoteColumns.MODIFIED_DATE,
|
||||
NoteColumns.SNIPPET,
|
||||
NoteColumns.TYPE
|
||||
};
|
||||
|
||||
private static final String[] DATA_PROJECTION = {
|
||||
DataColumns.CONTENT,
|
||||
DataColumns.MIME_TYPE,
|
||||
DataColumns.DATA1,
|
||||
DataColumns.DATA2,
|
||||
DataColumns.DATA3,
|
||||
DataColumns.DATA4,
|
||||
};
|
||||
|
||||
// 笔记和数据表的列索引
|
||||
private static final int NOTE_COLUMN_ID = 0;
|
||||
private static final int NOTE_COLUMN_MODIFIED_DATE = 1;
|
||||
private static final int NOTE_COLUMN_SNIPPET = 2;
|
||||
private static final int DATA_COLUMN_CONTENT = 0;
|
||||
private static final int DATA_COLUMN_MIME_TYPE = 1;
|
||||
private static final int DATA_COLUMN_CALL_DATE = 2;
|
||||
private static final int DATA_COLUMN_PHONE_NUMBER = 4;
|
||||
|
||||
// 文本格式数组
|
||||
private final String[] TEXT_FORMAT;
|
||||
private static final int FORMAT_FOLDER_NAME = 0;
|
||||
private static final int FORMAT_NOTE_DATE = 1;
|
||||
private static final int FORMAT_NOTE_CONTENT = 2;
|
||||
|
||||
// 上下文和文件名变量
|
||||
private Context mContext;
|
||||
private String mFileName;
|
||||
private String mFileDirectory;
|
||||
|
||||
// 构造函数
|
||||
public TextExport(Context context) {
|
||||
TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note);
|
||||
mContext = context;
|
||||
mFileName = "";
|
||||
mFileDirectory = "";
|
||||
}
|
||||
|
||||
// 获取文本格式字符串
|
||||
private String getFormat(int id) {
|
||||
return TEXT_FORMAT[id];
|
||||
}
|
||||
|
||||
// 导出文件夹到文本
|
||||
private void exportFolderToText(String folderId, PrintStream ps) {
|
||||
// 查询文件夹下的笔记
|
||||
Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI,
|
||||
NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] {
|
||||
folderId
|
||||
}, null);
|
||||
|
||||
// 如果存在笔记,则导出
|
||||
if (notesCursor != null) {
|
||||
if (notesCursor.moveToFirst()) {
|
||||
do {
|
||||
ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format(
|
||||
mContext.getString(R.string.format_datetime_mdhm),
|
||||
notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE))));
|
||||
String noteId = notesCursor.getString(NOTE_COLUMN_ID);
|
||||
exportNoteToText(noteId, ps);
|
||||
} while (notesCursor.moveToNext());
|
||||
}
|
||||
notesCursor.close();
|
||||
}
|
||||
}
|
||||
|
||||
// 导出笔记到文本
|
||||
private void exportNoteToText(String noteId, PrintStream ps) {
|
||||
Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI,
|
||||
DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] {
|
||||
noteId
|
||||
}, null);
|
||||
|
||||
if (dataCursor != null) {
|
||||
if (dataCursor.moveToFirst()) {
|
||||
do {
|
||||
// 导出笔记内容
|
||||
String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE);
|
||||
if (DataConstants.CALL_NOTE.equals(mimeType)) {
|
||||
// 导出电话笔记内容
|
||||
// ...
|
||||
} else if (DataConstants.NOTE.equals(mimeType)) {
|
||||
// 导出普通笔记内容
|
||||
// ...
|
||||
}
|
||||
} while (dataCursor.moveToNext());
|
||||
}
|
||||
dataCursor.close();
|
||||
}
|
||||
}
|
||||
|
||||
// 导出到文本文件的主方法
|
||||
public int exportToText() {
|
||||
// 检查外部存储是否可用
|
||||
if (!externalStorageAvailable()) {
|
||||
Log.d(TAG, "Media was not mounted");
|
||||
return STATE_SD_CARD_UNMOUONTED;
|
||||
}
|
||||
|
||||
// 获取文本文件打印流
|
||||
PrintStream ps = getExportToTextPrintStream();
|
||||
if (ps == null) {
|
||||
Log.e(TAG, "get print stream error");
|
||||
return STATE_SYSTEM_ERROR;
|
||||
}
|
||||
|
||||
// 导出文件夹和笔记到文本文件
|
||||
// ...
|
||||
|
||||
return STATE_SUCCESS;
|
||||
}
|
||||
|
||||
// 获取导出到文本文件的打印流
|
||||
private PrintStream getExportToTextPrintStream() {
|
||||
// 生成文件
|
||||
File file = generateFileMountedOnSDcard(mContext, R.string.file_path,
|
||||
R.string.file_name_txt_format);
|
||||
if (file == null) {
|
||||
Log.e(TAG, "create file to exported failed");
|
||||
return null;
|
||||
}
|
||||
mFileName = file.getName();
|
||||
mFileDirectory = mContext.getString(R.string.file_path);
|
||||
PrintStream ps = null;
|
||||
try {
|
||||
FileOutputStream fos = new FileOutputStream(file);
|
||||
ps = new PrintStream(fos);
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
} catch (NullPointerException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
return ps;
|
||||
}
|
||||
}
|
||||
|
||||
// 导出状态常量
|
||||
public static final int STATE_SD_CARD_UNMOUONTED = 0;
|
||||
public static final int STATE_SUCCESS = 4;
|
||||
public static final int STATE_SYSTEM_ERROR = 3;
|
||||
|
||||
// 构造导出工具
|
||||
public BackupUtils(Context context) {
|
||||
mTextExport = new TextExport(context);
|
||||
}
|
||||
|
||||
// 外部存储是否可用
|
||||
private static boolean externalStorageAvailable
|
||||
// 外部存储是否可用
|
||||
private static boolean externalStorageAvailable() {
|
||||
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
|
||||
}
|
||||
|
||||
// 生成文件存储在SD卡上
|
||||
private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(Environment.getExternalStorageDirectory()); // 获取SD卡路径
|
||||
sb.append(context.getString(filePathResId)); // 获取文件路径
|
||||
File filedir = new File(sb.toString()); // 创建文件路径对象
|
||||
sb.append(context.getString(
|
||||
fileNameFormatResId,
|
||||
DateFormat.format(context.getString(R.string.format_date_ymd),
|
||||
System.currentTimeMillis())));
|
||||
File file = new File(sb.toString());
|
||||
|
||||
try {
|
||||
if (!filedir.exists()) {
|
||||
filedir.mkdir(); // 如果路径不存在,则创建路径
|
||||
}
|
||||
if (!file.exists()) {
|
||||
file.createNewFile(); // 如果文件不存在,则创建文件
|
||||
}
|
||||
return file;
|
||||
} catch (SecurityException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
Binary file not shown.
Loading…
Reference in new issue