SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(parent);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("MeMoMaInfo", data);
- editor.apply();
+ editor.apply();
// 選択したアイテムをロードする!
loadFileWithName(data);
package jp.sourceforge.gokigen.memoma.io;
+import static jp.sourceforge.gokigen.memoma.Main.APP_NAMESPACE;
+
import java.io.File;
-import java.io.FileWriter;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.Locale;
import android.app.ProgressDialog;
+import android.content.ContentResolver;
+import android.content.ContentValues;
import android.content.Context;
import android.graphics.RectF;
+import android.net.Uri;
import android.os.AsyncTask;
+import android.os.Build;
+import android.os.Environment;
+import android.provider.MediaStore;
import android.util.Log;
-import jp.sourceforge.gokigen.memoma.Main;
import jp.sourceforge.gokigen.memoma.R;
import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
import jp.sourceforge.gokigen.memoma.holders.PositionObject;
/**
* データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
- *
- * AsyncTask
- * MeMoMaObjectHolder : 実行時に渡すクラス(Param)
- * Integer : 途中経過を伝えるクラス(Progress)
- * String : 処理結果を伝えるクラス(Result)
- *
- * @author MRSa
- *
*/
public class MeMoMaFileExportCsvProcess extends AsyncTask<MeMoMaObjectHolder, Integer, String>
{
private final String TAG = toString();
private final Context context;
- private IResultReceiver receiver;
+ private final IResultReceiver receiver;
private String exportedFileName = null;
- private ProgressDialog savingDialog;
+ private final ProgressDialog savingDialog;
/**
* コンストラクタ
savingDialog.setCancelable(false);
savingDialog.show();
- // ファイルをバックアップするディレクトリを作成する
- File dir = new File(context.getFilesDir() + "/exported");
- if (!dir.mkdir())
- {
- Log.v(toString(), "mkDir() fail. : " + dir.getAbsolutePath());
- }
+
}
/**
@Override
protected void onPreExecute()
{
+
}
/**
* データを(CSV形式で)保管する。
*
*/
- private String exportToCsvFile(String fileName, MeMoMaObjectHolder objectHolder)
+ private String exportToCsvFile(String baseName, MeMoMaObjectHolder objectHolder)
{
String resultMessage = "";
try
{
+ String outputDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath() + "/" + APP_NAMESPACE + "/";
+ ContentResolver resolver = context.getContentResolver();
+
// エクスポートするファイル名を決定する
Calendar calendar = Calendar.getInstance();
- SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US);
- exportedFileName = fileName + "_" + outFormat.format(calendar.getTime()) + ".csv";
- FileWriter writer = new FileWriter(new File(exportedFileName));
+ SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMdd_HHmmss_", Locale.US);
+ exportedFileName = outFormat.format(calendar.getTime()) + baseName + ".csv";
+
+ Uri extStorageUri;
+ ContentValues values = new ContentValues();
+ values.put(MediaStore.Downloads.TITLE, exportedFileName);
+ values.put(MediaStore.Downloads.DISPLAY_NAME, exportedFileName);
+ values.put(MediaStore.Downloads.MIME_TYPE, "text/csv"); // text/plain or text/csv
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
+ {
+ values.put(MediaStore.Downloads.RELATIVE_PATH, "Download/" + APP_NAMESPACE);
+ values.put(MediaStore.Downloads.IS_PENDING, true);
+ extStorageUri = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
+ }
+ else
+ {
+ File path = new File(outputDir);
+ values.put(MediaStore.Downloads.DATA, path.getAbsolutePath() + File.separator + exportedFileName);
+ extStorageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
+ }
+ Log.v(TAG, "---------- " + exportedFileName + " " + values);
+
+ Uri documentUri = resolver.insert(extStorageUri, values);
+
+ if (documentUri == null)
+ {
+ resultMessage = "documentUri is NULL.";
+ return (resultMessage);
+ }
+
+ OutputStream outputStream = resolver.openOutputStream(documentUri, "wa");
+ OutputStreamWriter writer = new OutputStreamWriter(outputStream);
// データのタイトルを出力
String str = "; label,detail,userChecked,shape,style,centerX,centerY,width,height,;!<_$ (';!<_$' is a record Separator)\r\n";
}
writer.flush();
writer.close();
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
+ {
+ values.put(MediaStore.Downloads.IS_PENDING, false);
+ resolver.update(documentUri, values, null, null);
+ }
}
catch (Exception e)
{
- resultMessage = " ERR>" + e.toString();
+ resultMessage = " ERR " + e.getMessage();
Log.v(TAG, resultMessage);
e.printStackTrace();
}
/**
* データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
- *
* AsyncTask
* MeMoMaObjectHolder : 実行時に渡すクラス(Param)
* Integer : 途中経過を伝えるクラス(Progress)
{
private final String TAG = toString();
private final Context parent;
- private IResultReceiver receiver;
+ private final IResultReceiver receiver;
private PositionObject position = null;
private ObjectConnector line = null;
}
catch (Exception e)
{
- resultMessage = " ERR>" + e.getMessage();
+ resultMessage = " ERR " + e.getMessage();
Log.v(TAG, resultMessage);
- e.printStackTrace();
+ e.printStackTrace();
}
return (resultMessage);
}
/**
* 非同期処理
* (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
- *
*/
@Override
protected String doInBackground(MeMoMaObjectHolder... datas)
{
receiver.onLoadingProcess();
}
-
- System.gc();
- return (result);
+ System.gc();
+ return (result);
}
/**
* 非同期処理の進捗状況の更新
/**
* データをファイルに保存するエンジン部分
- *
- * @author MRSa
- *
*/
public class MeMoMaFileSavingEngine
{
private final String TAG = toString();
private final Context context;
- private String backgroundUri = null;
- private String userCheckboxString = null;
+ private final String backgroundUri;
+ private final String userCheckboxString;
/**
* コンストラクタ
{
this.context = context;
- // ファイルをバックアップするディレクトリを作成する
- File dir = new File(context.getFilesDir() + "/backup");
- dir.mkdir();
-
// 設定データ読み出し用...。
backgroundUri = bgUri;
userCheckboxString = checkBoxLabel;
}
/**
- * ファイルが存在したとき、リネームする
- *
- */
- private boolean renameFile(String targetFileName, String newFileName)
- {
- boolean ret = true;
- File targetFile = new File(targetFileName);
- if (targetFile.exists())
- {
- // ファイルが存在した、、、ファイル名を1世代古いものに変更する
- ret = targetFile.renameTo(new File(newFileName));
- }
- return (ret);
- }
-
- /**
- * 保管データを複数世代保管する。
- *
- *
- */
- private void backupFiles(String dirName, String backupFileName)
- {
- // データをバックアップする。(上書き予定のファイルがあれば、それをコピーする)
- boolean result = true;
- try
- {
- String fileName = dirName + "backup/" + backupFileName;
- File backFile = new File(fileName + ".xml.bak5");
- if (backFile.exists())
- {
- // ファイルが存在した、、、削除する
- backFile.delete();
- }
- backFile = null;
- renameFile((fileName + ".xml.bak4"), (fileName + ".xml.bak5"));
- renameFile((fileName + ".xml.bak3"), (fileName + ".xml.bak4"));
- renameFile((fileName + ".xml.bak2"), (fileName + ".xml.bak3"));
- renameFile((fileName + ".xml.bak1"), (fileName + ".xml.bak2"));
- renameFile((fileName + ".xml.bak"), (fileName + ".xml.bak1"));
- renameFile((dirName + backupFileName + ".xml"), (fileName + ".xml.bak"));
- }
- catch (Exception ex)
- {
- // 何か例外が発生した場合にはエラーと認識する。
- result = false;
- }
- if (!result)
- {
- // バックアップファイルのコピー失敗をログに記述する
- Log.v(TAG, "rename failure : " + dirName + backupFileName + ".xml");
- }
- }
-
- /**
* データを(XML形式で)保管する。
*
*/
}
catch (Exception e)
{
- resultMessage = " " + e.getMessage();
- Log.v(TAG, e.getMessage());
+ resultMessage = " " + e.getMessage();
+ Log.v(TAG, resultMessage);
e.printStackTrace();
- }
+ }
return (resultMessage);
}
public String saveObjects(MeMoMaObjectHolder objectHolder)
{
// データタイトルがない場合...保存処理は行わない。
- if (objectHolder.getDataTitle().length() <= 0)
+ if (objectHolder.getDataTitle().length() == 0)
{
Log.v(TAG, "MeMoMaFileSavingEngine::saveObjects() : specified file name is illegal, save aborted. : " + objectHolder.getDataTitle() );
return("Data is empty, not saved.");
}
- //// バックアップを保存する
- //backupFiles(context.getFilesDir() + "/" , objectHolder.getDataTitle());
-
- // ファイル名の設定 ... (拡張子なし)
- String fileName = context.getFilesDir() + "/" + objectHolder.getDataTitle();
-
- // データを保管する
- return (storeToXmlFile(fileName, objectHolder));
+ // データを保管する (ファイル名の設定は、拡張子なし
+ return (storeToXmlFile(context.getFilesDir() + "/" + objectHolder.getDataTitle(), objectHolder));
}
}
import android.preference.PreferenceManager;
import android.util.Log;
-import jp.sourceforge.gokigen.memoma.Main;
import jp.sourceforge.gokigen.memoma.R;
import jp.sourceforge.gokigen.memoma.holders.MeMoMaObjectHolder;
/**
* データをファイルに保存するとき用 アクセスラッパ (非同期処理を実行)
- *
* AsyncTask
* MeMoMaObjectHolder : 実行時に渡すクラス(Param)
* Integer : 途中経過を伝えるクラス(Progress)
private final String TAG = toString();
private final Context context;
- private IResultReceiver receiver = null;
- //private ExternalStorageFileUtility fileUtility = null;
- private ISavingStatusHolder statusHolder = null;
+ private final IResultReceiver receiver;
+ private final ISavingStatusHolder statusHolder;
- private String backgroundUri = null;
- private String userCheckboxString = null;
- private ProgressDialog savingDialog = null;
+ private final String backgroundUri;
+ private final String userCheckboxString;
+ private final ProgressDialog savingDialog;
/**
* コンストラクタ
/**
* 非同期処理
* (バックグラウンドで実行する(このメソッドは、UIスレッドと別のところで実行する))
- *
*/
@Override
protected String doInBackground(MeMoMaObjectHolder... datas)
{
- // 保管中状態を設定する
- statusHolder.setSavingStatus(true);
+ // 保管中状態を設定する
+ statusHolder.setSavingStatus(true);
- // データの保管メイン
- MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(context, backgroundUri, userCheckboxString);
- String result = savingEngine.saveObjects(datas[0]);
+ // データの保管メイン
+ MeMoMaFileSavingEngine savingEngine = new MeMoMaFileSavingEngine(context, backgroundUri, userCheckboxString);
+ String result = savingEngine.saveObjects(datas[0]);
- System.gc();
-
- // 未保管状態にリセットする
- statusHolder.setSavingStatus(false);
+ System.gc();
+
+ // 未保管状態にリセットする
+ statusHolder.setSavingStatus(false);
return (result);
}
/**
* 結果報告用のインタフェース(積極的に使う予定はないけど...)
- *
- * @author MRSa
- *
*/
public interface IResultReceiver
{
- /** 保存結果の報告 **/
- public abstract void onSavedResult(String detail);
+ // 保存結果の報告
+ void onSavedResult(String detail);
}
/**
* ファイル保存実施状態を記憶するインタフェースクラス
- *
- * @author MRSa
- *
*/
public interface ISavingStatusHolder
{
- /** 保存中状態を設定する **/
- public abstract void setSavingStatus(boolean isSaving);
+ // 保存中状態を設定する
+ void setSavingStatus(boolean isSaving);
- /** 保存中状態を取得する **/
- public abstract boolean getSavingStatus();
+ // 保存中状態を取得する
+ boolean getSavingStatus();
}
}