プログラミング素人です。誰かこのコードが動くように修正して感想欄に貼り付けてください
// 必要なパッケージやライブラリをインポートします
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.FileProvider;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.drive.Drive;
import com.google.android.gms.drive.DriveClient;
import com.google.android.gms.drive.DriveResourceClient;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
// メインアクティビティを定義します
public class MainActivity extends AppCompatActivity {
// 定数や変数を宣言します
private static final int REQUEST_IMAGE_CAPTURE = 1; // カメラボタンを押した時のリクエストコード
private static final int REQUEST_FILE_PICKER = 2; // ファイルボタンを押した時のリクエストコード
private static final int REQUEST_REVIEW = 3; // 復習ボタンを押した時のリクエストコード
private static final int REQUEST_LIST = 4; // 一覧ボタンを押した時のリクエストコード
private Button cameraButton; // カメラボタン
private Button fileButton; // ファイルボタン
private Button reviewButton; // 復習ボタン
private Button listButton; // 一覧ボタン
private ImageView imageView; // 画像を表示するビュー
private TextView textView; // テキストを表示するビュー
private String currentPhotoPath; // 現在表示している画像のパス
private String currentPhotoName; // 現在表示している画像の名前
private String currentPhotoDate; // 現在表示している画像の日付
private String currentPhotoFeedback; // 現在表示している画像のフィードバック
private int currentPhotoFeedbackCount; // 現在表示している画像のフィードバック回数
private int currentPhotoStar; // 現在表示している画像の☆印
private ArrayList<String> photoPaths; // 画像のパスのリスト
private ArrayList<String> photoNames; // 画像の名前のリスト
private ArrayList<String> photoDates; // 画像の日付のリスト
private ArrayList<String> photoFeedbacks; // 画像のフィードバックのリスト
private ArrayList<Integer> photoFeedbackCounts; // 画像のフィードバック回数のリスト
private ArrayList<Integer> photoStars; // 画像の☆印のリスト
private DriveClient driveClient; // Google Driveにアクセスするためのクライアント
private DriveResourceClient driveResourceClient; // Google Driveにアクセスするためのリソースクライアント
private int reviewSpan1 = 1; // 復習スパン1(初期値は1日)
private int reviewSpan2 = 7; // 復習スパン2(初期値は7日)
private int reviewSpan3 = 30; // 復習スパン3(初期値は30日)
private int reviewSpan4 = 90; // 復習スパン4(初期値は90日)
private int reviewSpan5 = 180; // 復習スパン5(初期値は180日)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ビューやボタンをレイアウトから取得します
imageView = findViewById(R.id.imageView);
textView = findViewById(R.id.textView);
cameraButton = findViewById(R.id.cameraButton);
fileButton = findViewById(R.id.fileButton);
reviewButton = findViewById(R.id.reviewButton);
listButton = findViewById(R.id.listButton);
// リストを初期化します
photoPaths = new ArrayList<>();
photoNames = new ArrayList<>();
photoDates = new ArrayList<>();
photoFeedbacks = new ArrayList<>();
photoFeedbackCounts = new ArrayList<>();
photoStars = new ArrayList<>();
// Google Driveに接続します
connectToDrive();
// カメラボタンを押した時の処理を設定します
cameraButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dispatchTakePictureIntent(); // カメラアプリを起動します
}
});
// ファイルボタンを押した時の処理を設定します
fileButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dispatchPickFileIntent(); // ファイルピッカーを起動します
}
});
// 復習ボタンを押した時の処理を設定します
reviewButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dispatchReviewIntent(); // 復習アクティビティを起動します
}
});
// 一覧ボタンを押した時の処理を設定します
listButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dispatchListIntent(); // 一覧アクティビティを起動します
}
});
}
// Google Driveに接続するメソッドです
private void connectToDrive() {
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); // グーグルアカウントを取得します
if (account != null) { // アカウントがあれば
driveClient = Drive.getDriveClient(this, account); // ドライブクライアントを作成します
driveResourceClient = Drive.getDriveResourceClient(this, account); // ドライブリソースクライアントを作成します
// TODO: バックアップや復元 // TODO: バックアップや復元
} else {
// アカウントがなければ
textView.setText("グーグルアカウントにログインしてください"); // テキストビューにメッセージを表示します
}
}
// カメラアプリを起動するメソッドです
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // カメラアプリを呼び出すインテントを作成します
if (takePictureIntent.resolveActivity(getPackageManager()) != null) { // カメラアプリが存在すれば
File photoFile = null; // 写真ファイルを初期化します
try {
photoFile = createImageFile(); // 写真ファイルを作成します
} catch (IOException e) {
e.printStackTrace(); // 例外が発生したらスタックトレースを出力します
}
if (photoFile != null) { // 写真ファイルが作成できたら
Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile); // 写真ファイルのURIを取得します
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); // インテントに写真ファイルのURIを渡します
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); // カメラアプリを起動します
}
}
}
// ファイルピッカーを起動するメソッドです
private void dispatchPickFileIntent() {
Intent pickFileIntent = new Intent(Intent.ACTION_GET_CONTENT); // ファイルピッカーを呼び出すインテントを作成します
pickFileIntent.setType("image/*|application/pdf"); // 画像ファイルとPDFファイルのみ選択できるようにします
pickFileIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); // 複数のファイルを選択できるようにします
startActivityForResult(pickFileIntent, REQUEST_FILE_PICKER); // ファイルピッカーを起動します
}
// 復習アクティビティを起動するメソッドです
private void dispatchReviewIntent() {
Intent reviewIntent = new Intent(this, ReviewActivity.class); // 復習アクティビティを呼び出すインテントを作成します
reviewIntent.putExtra("photoPaths", photoPaths); // 画像のパスのリストを渡します
reviewIntent.putExtra("photoNames", photoNames); // 画像の名前のリストを渡します
reviewIntent.putExtra("photoDates", photoDates); // 画像の日付のリストを渡します
reviewIntent.putExtra("photoFeedbacks", photoFeedbacks); // 画像のフィードバックのリストを渡します
reviewIntent.putExtra("photoFeedbackCounts", photoFeedbackCounts); // 画像のフィードバック回数のリストを渡します
reviewIntent.putExtra("photoStars", photoStars); // 画像の☆印のリストを渡します
reviewIntent.putExtra("reviewSpan1", reviewSpan1); // 復習スパン1を渡します
reviewIntent.putExtra("reviewSpan2", reviewSpan2); // 復習スパン2を渡します
reviewIntent.putExtra("reviewSpan3", reviewSpan3); // 復習スパン3を渡します
reviewIntent.putExtra("reviewSpan4", reviewSpan4); // 復習スパン4を渡します
reviewIntent.putExtra("reviewSpan5", reviewSpan5); // 復習スパン5を渡します
startActivityForResult(reviewIntent, REQUEST_REVIEW); // 復習アクティビティを起動します
}
// 一覧アクティビティを起動するメソッドです
private void dispatchListIntent() {
Intent listIntent = new Intent(this, ListActivity.class); // 一覧アクティビティを呼び出すインテントを作成します
listIntent.putExtra("photoPaths", photoPaths); // 画像のパスのリストを渡します
listIntent.putExtra("photoNames", photoNames); // 画像の名前のリストを渡します
listIntent.putExtra("photoDates", photoDates); // 画像の日付のリストを渡します
listIntent.putExtra("photoFeedbacks", photoFeedbacks); // 画像のフィードバックのリストを渡します
listIntent.putExtra("photoFeedbackCounts", photoFeedbackCounts); // 画像のフィードバック回数のリストを渡します
listIntent.putExtra("photoStars", photoStars); // 画像の☆印のリストを渡します
startActivityForResult(listIntent, REQUEST_LIST); // 一覧アクティビティを起動します
}
// 写真ファイルを作成するメソッドです
private File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); // 現在の日時を取得します
String imageFileName = "JPEG_" + timeStamp + "_"; // 画像ファイル名を作成します
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); // ストレージディレクトリを取得します
File image = File.createTempFile( // 画像ファイルを作成します
imageFileName, // ファイル名
".jpg", // 拡張子
storageDir // ディレクトリ
);
currentPhotoPath = image.getAbsolutePath(); // 現在の画像パスにセットします
currentPhotoName = image.getName(); // 現在の画像名にセットします
currentPhotoDate = timeStamp; // 現在の画像日付にセットします
return image; // 画像ファイルを返します
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { // カメラアプリから戻ってきたら
Bitmap bitmap = null; // ビットマップを初期化します
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(currentPhotoPath)); // 画像パスからビットマップを取得します
} catch (IOException e) {
e.printStackTrace(); // 例外が発生したらスタックトレースを出力します
}
if (bitmap != null) { // ビットマップが取得できたら
imageView.setImageBitmap(bitmap); // 画像ビューにビットマップをセットします
currentPhotoFeedback = ""; // 現在の画像フィードバックに空文字をセットします
currentPhotoFeedbackCount = 0; // 現在の画像フィードバック回数に0をセットします
currentPhotoStar = 0; // 現在の画像☆印に0をセットします
photoPaths.add(currentPhotoPath); // 画像パスのリストに現在の画像パスを追加します
photoNames.add(currentPhotoName); // 画像名のリストに現在の画像名を追加します
photoDates.add(currentPhotoDate); // 画像日付のリストに現在の画像日付を追加します
photoFeedbacks.add(currentPhotoFeedback); // 画像フィードバックのリストに現在の画像フィードバックを追加します
photoFeedbackCounts.add(currentPhotoFeedbackCount); // 画像フィードバック回数のリストに現在の画像フィードバック回数を追加します
photoStars.add(currentPhotoStar); // 画像☆印のリストに現在の画像☆印を追加します
textView.setText("写真が追加されました\n" + "名前: " + currentPhotoName + "\n" + "日付: " + currentPhotoDate + "\n" + "フィードバック");
textView.setText("写真が追加されました\n" + "名前: " + currentPhotoName + "\n" + "日付: " + currentPhotoDate + "\n" + "フィードバック: " + currentPhotoFeedback + "\n" + "フィードバック回数: " + currentPhotoFeedbackCount + "\n" + "☆印: " + currentPhotoStar); // テキストビューに画像の情報を表示します
// TODO: 画像に対して◯、△、✗でフィードバックを行い記録する
// TODO: 画像を任意にトリミングできる
// TODO: 画像に対して任意で自由に呼び出せるテキストファイルを添付してコメントを添えることができる
// TODO: 画像を表示中に赤シートと緑シートを自由に呼び出して暗記用に使える
// TODO: 画像に対して任意で☆印をつけ、☆印をつけられた問題は例外的に復習スパンに加えて毎日表示される。☆は任意に消せる。
}
} else if (requestCode == REQUEST_FILE_PICKER && resultCode == RESULT_OK) { // ファイルピッカーから戻ってきたら
if (data != null) { // データがあれば
if (data.getClipData() != null) { // 複数のファイルが選択されたら
int count = data.getClipData().getItemCount(); // 選択されたファイルの数を取得します
for (int i = 0; i < count; i++) { // 各ファイルに対して
Uri fileUri = data.getClipData().getItemAt(i).getUri(); // ファイルのURIを取得します
String filePath = fileUri.getPath(); // ファイルのパスを取得します
String fileName = fileUri.getLastPathSegment(); // ファイルの名前を取得します
String fileDate = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); // ファイルの日付を取得します
photoPaths.add(filePath); // 画像パスのリストにファイルパスを追加します
photoNames.add(fileName); // 画像名のリストにファイル名を追加します
photoDates.add(fileDate); // 画像日付のリストにファイル日付を追加します
photoFeedbacks.add(""); // 画像フィードバックのリストに空文字を追加します
photoFeedbackCounts.add(0); // 画像フィードバック回数のリストに0を追加します
photoStars.add(0); // 画像☆印のリストに0を追加します
textView.append("\nファイルが追加されました\n" + "名前: " + fileName + "\n" + "日付: " + fileDate); // テキストビューにファイルの情報を追加します
// TODO: ファイルに対して◯、△、✗でフィードバックを行い記録する
// TODO: ファイルに対して任意で自由に呼び出せるテキストファイルを添付してコメントを添えることができる
// TODO: ファイルに対して任意で☆印をつけ、☆印をつけられた問題は例外的に復習スパンに加えて毎日表示される。☆は任意に消せる。
}
} else if (data.getData() != null) { // 単一のファイルが選択されたら
Uri fileUri = data.getData(); // ファイルのURIを取得します
String filePath = fileUri.getPath(); // ファイルのパスを取得します
String fileName = fileUri.getLastPathSegment(); // ファイルの名前を取得します
String fileDate = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); // ファイルの日付を取得します
photoPaths.add(filePath); // 画像パスのリストにファイルパスを追加します
photoNames.add(fileName); // 画像名のリストにファイル名を追加します
photoDates.add(fileDate); // 画像日付のリストにファイル日付を追加します
photoFeedbacks.add(""); // 画像フィードバックのリストに空文字を追加します
photoFeedbackCounts.add(0); // 画像フィードバック回数のリストに0を追加します
photoStars.add(0); // 画像☆印のリストに0を追加します
textView.setText("ファイルが追加されました\n" + "名前: " + fileName + "\n" + "日付: " + fileDate); // テキストビューにファイルの情報を表示します
// TODO: ファイルに対して◯、△、✗でフィードバックを行い記録する
// TODO: ファイルに対して任意で自由に呼び出せるテキストファイルを添付してコメントを添えることができる
// TODO: ファイルに対して任意で☆印をつけ、☆印をつけられた問題は例外的に復習スパンに加えて毎日表示される。☆は任意に消せる。
}
}
} else if (requestCode == REQUEST_REVIEW && resultCode == RESULT_OK) { // 復習アクティビティから戻ってきたら
if (data != null) { // データがあれば
photoPaths = data.getStringArrayListExtra("photoPaths"); // 画像パスのリストを更新します
photoNames = data.getStringArrayListExtra("photoNames"); // 画像名のリストを更新します
photoDates = data.getStringArrayListExtra("photoDates"); // 画像日付のリストを更新します
photoFeedbacks = data.getStringArrayListExtra("photoFeedbacks"); // 画像フィードバックのリストを更新します
photoFeedbackCounts = data.getIntegerArrayListExtra("photoFeedbackCounts"); // 画像フィードバック回数のリストを更新します
photoStars = data.getIntegerArrayListExtra("photoStars"); // 画像☆印のリストを更新します
reviewSpan1 = data.getIntExtra("reviewSpan1", reviewSpan1); // 復習スパン1を更新します
reviewSpan2 = data.getIntExtra("reviewSpan2", reviewSpan2); // 復習スパン2を更新します
reviewSpan3 = data.getIntExtra("reviewSpan3", reviewSpan3); // 復習スパン3を更新します
reviewSpan4 = data.getIntExtra("reviewSpan4", reviewSpan4); // 復習スパン4を更新します
reviewSpan5 = data.getIntExtra("reviewSpan5", reviewSpan5); // 復習スパン5を更新します
textView.setText("復習が完了しました"); // テキストビューにメッセージを表示します
}
} else if (requestCode == REQUEST_LIST && resultCode == RESULT_OK) { // 一覧アクティビティから戻ってきたら
if (data != null) { // データがあれば
photoPaths = data.getStringArrayListExtra("photoPaths"); // 画像パスのリストを更新します
photoNames = data.getStringArrayListExtra("photoNames"); // 画像名のリストを更新します
photoDates = data.getStringArrayListExtra("photoDates"); // 画像日付のリストを更新します
photoFeedbacks = data.getStringArrayListExtra("photoFeedbacks"); // 画像フィードバックのリスト
photoFeedbacks = data.getStringArrayListExtra("photoFeedbacks"); // 画像フィードバックのリストを更新します
photoFeedbackCounts = data.getIntegerArrayListExtra("photoFeedbackCounts"); // 画像フィードバック回数のリストを更新します
photoStars = data.getIntegerArrayListExtra("photoStars"); // 画像☆印のリストを更新します
textView.setText("一覧が完了しました"); // テキストビューにメッセージを表示します
}
};
}