ともちゃんのアプリ開発日記

組込みC言語プログラマだったともちゃんが、四苦八苦しながら、AndroidのJAVA/Kotlin、iOSのSwiftUIを習得して行きます。ともちゃんの備忘録も兼ねています。

暗黙的インテントによるファイルの読み込み

1.マニフェスト

CSVファイルを選択したときに、アプリが起動するようにするために。

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/*" />
</intent-filter>

 

これだと、テキストファイ選択したときにアプリが起動するんだけど、CSVファイルに限定するやり方がわからなかった。

 

2.インポートメソッドソースコード

public int importFile(Context context, Uri importUri, ProgressDialog progressDialog) {
// File srcFile = new File(CSVfile);
// InputStream inputFile;
try {
InputStream inputStream = context.getContentResolver().openInputStream(importUri);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(inputStreamReader);
String AcpplicationTitle = reader.readLine();
if (!AcpplicationTitle.equals(context.getText(R.string.app_name).toString())) {
return NOT_DIET_REC_FILE;
}
String strVersionCode = reader.readLine();

String[] strs;
strs = strVersionCode.split(",");
int version = Integer.valueOf(strs[1]);
switch (version) {
case 1:
String PrefecensesTitle = reader.readLine();
String PrefecensesData = reader.readLine();
strs = PrefecensesData.split(",");
if (strs.length != 4) {
return INVALID_PREFERENCE_DATA_COUNT;
}
float targetTall = Float.valueOf(strs[0]);
float targetWeight = Float.valueOf(strs[1]);
float targetBodyFatPercentage = Float.valueOf(strs[2]);
float targetBMI = Float.valueOf(strs[3]);
SharedPreferences prefs = context.getSharedPreferences("setting", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putFloat("TargetTall", targetTall);
editor.putFloat("TargetWeight", targetWeight);
editor.putFloat("TargetBodyFatPercentage", targetBodyFatPercentage);
editor.putFloat("TargetBMI", targetBMI);
// editor.commit();
editor.apply();

String strDataCount = reader.readLine();
strs = strDataCount.split(",");
long dataCount = Long.valueOf(strs[1]);
String DataTitle = reader.readLine();
DatabaseManager databaseManager = new DatabaseManager();
progressDialog.setMax((int) dataCount);
for (long i = 0; i < dataCount; i++) {
String strData = reader.readLine();
strs = strData.split(",");
switch (strs.length) {
case 11:
databaseManager.replaceDatabase(
strs[0], // 日付
Float.valueOf(strs[1]), // 体重
Float.valueOf(strs[2]), // 体脂肪率
Float.valueOf(strs[3]), // BMI
Float.valueOf(strs[4]), // 目標体重
Float.valueOf(strs[5]), // 目標体脂肪率
Float.valueOf(strs[6]), // 目標BMI
Integer.valueOf(strs[7]), // スタンプ●
Integer.valueOf(strs[8]), // スタンプ×
Integer.valueOf(strs[9]), // スタンプ▲
Integer.valueOf(strs[10]), // スタンプ★
""); // メモ
break;
case 12:
databaseManager.replaceDatabase(
strs[0], // 日付
Float.valueOf(strs[1]), // 体重
Float.valueOf(strs[2]), // 体脂肪率
Float.valueOf(strs[3]), // BMI
Float.valueOf(strs[4]), // 目標体重
Float.valueOf(strs[5]), // 目標体脂肪率
Float.valueOf(strs[6]), // 目標BMI
Integer.valueOf(strs[7]), // スタンプ●
Integer.valueOf(strs[8]), // スタンプ×
Integer.valueOf(strs[9]), // スタンプ▲
Integer.valueOf(strs[10]), // スタンプ★
strs[11]); // メモ
break;
default:
return INVALID_DB_DATA_COUNT;
}
progressDialog.setProgress((int) i);
try {
Thread.sleep(WAIT_TIME); //200ミリ秒Sleepする
} catch (InterruptedException e) {
}
}
break;
}
} catch(FileNotFoundException e) {
return FAIL_IN_FILE_OPEN;
} catch(IOException e) {
return FAIL_IN_FILE_READ;
}

return SUCCESS;
}

 

 3.MainActivityのonCreateの追加部分

if (getIntent().getAction() == Intent.ACTION_VIEW) {
Uri uri = getIntent().getData();
dataCenter.setImportUri(uri);
ExportImportFragment.AsyncImportProgress asyncImportProgress =new ExportImportFragment.AsyncImportProgress();
asyncImportProgress.execute();
}

 

 4.インポートのAsyncタスク部分

public static class AsyncImportProgress extends AsyncTask<Void, Void, String> {

ProgressDialog progressDialog;

@Override
protected void onPreExecute() {
// ここに前処理を記述します
// 例) プログレスダイアログ表示
DataCenter dataCenter = new DataCenter();
progressDialog = new ProgressDialog(dataCenter.getImportContext());
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage("処理を実行しています");
progressDialog.setCancelable(false);
progressDialog.show();
}
@Override
protected String doInBackground(Void... arg0) {
FileIO fileIO = new FileIO();
DataCenter dataCenter = new DataCenter();
int result = fileIO.importFile(dataCenter.getImportContext(), dataCenter.getImportUri(), progressDialog);

switch (result) {
case FAIL_IN_FILE_OPEN:
return "ファイルをオープンできませんでした";
case FAIL_IN_FILE_READ:
return "ファイルを読み込みできませんでした";
case NOT_DIET_REC_FILE:
return "ダイエットレコーダーのデータファイルではありません";
case INVALID_PREFERENCE_DATA_COUNT:
return "設定データの個数が不正です";
case INVALID_DB_DATA_COUNT:
return "データベースのデータの個数が不正です";
default:
return "成功";
}
}

@Override
protected void onPostExecute(String result) {
// バックグランド処理終了後の処理をここに記述します
// 例) プログレスダイアログ終了
// UIコンポーネントへの処理
progressDialog.dismiss();

DataCenter dataCenter = new DataCenter();
Toast.makeText(dataCenter.getImportContext(), result, Toast.LENGTH_LONG).show();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/d");
Date date = new Date();
String strDate = sdf.format(date);
DataMainFragment dataMainFragment = new DataMainFragment();
// DataCenter dataCenter = new DataCenter();
dataMainFragment.displayData(dataCenter.getDataMainView(), strDate);

}
}