前提
Kotlinを使用してGoogle Driveにファイルをバックアップ(アップロード)するアプリを作成しています。
しかし、Google認証からアップロードの流れが上手くいっていないようで、アップロード操作を2回行わないとファイルがアップロードされずに困っています。
エラーも出力されており、エラー内容を調べてもみましたが原因究明には至りませんでした。
実現したいこと
- 1度のアップロード操作でファイルがアップロードされるようにしたい。
- 発生しているエラーを解消したい。
該当のソースコード
MainActivity
override fun onNavigationItemSelected(item: MenuItem): Boolean { Log.d("TAG", "nav_backup: 1") signInGoogle() Log.d("TAG", "nav_backup: 2") Log.d("TAG", "nav_backup: 3") backupFile() Log.d("TAG", "nav_backup: 4") } private fun signInGoogle() { Log.d("TAG", "signInGoogle: 1") val googleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(Scope(DriveScopes.DRIVE_FILE)) .requestEmail() .build() val googleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions) googleSignInClient.let { Log.d("TAG", "signInGoogle: 2") val intent = it.signInIntent driveContent.launch(intent) Log.d("TAG", "signInGoogle: 3") } } private val driveContent = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { Log.d("TAG", "driveContent: 1") if (it.resultCode == Activity.RESULT_OK && it.data != null) { // ログイン成功 Log.d("TAG", "driveContent: 2") connectDrive(it.data!!) Log.d("TAG", "driveContent: 3") } else { // ログイン失敗 or キャンセル } } private fun connectDrive(intent: Intent) { Log.d("TAG", "connectDrive: 1") GoogleSignIn.getSignedInAccountFromIntent(intent) .addOnSuccessListener { Log.d("TAG", "connectDrive: 2") drive = GoogleDriveHelper.getGoogleDriveService( this, it, getString(R.string.app_name)) Log.d("TAG", "connectDrive: 2") googleDriveHelper = GoogleDriveHelper(drive) Log.d("TAG", "connectDrive: 3") //backupFile() } .addOnFailureListener { Log.w("Sign in failed", "connectDrive:") } } private fun backupFile() { Log.d("TAG", "backupFile: 1") // アップロード処理 }
ログ結果
nav_backup: 1 signInGoogle: 1 signInGoogle: 2 signInGoogle: 3 nav_backup: 2 nav_backup: 3 backupFile: 1 nav_backup: 4 ※エラーメッセージ(後述) driveContent: 1 driveContent: 2 connectDrive: 1 driveContent: 3 ※エラーメッセージ(後述) connectDrive: 2 connectDrive: 2 connectDrive: 3
エラーメッセージ(前述のもの)
2022-05-26 17:08:25.768 2076-2950/com.google.android.gms.persistent E/SQLiteDatabase: Error inserting service_kind=0 source=16 tag=Measurement.PackageMeasurementTaskService.UPLOAD_TASK_TAG requires_charging=0 target_package=com.google.android.gms source_version=202414000 required_network_type=0 flex_time=437000 persistence_level=1 target_class=com.google.android.gms.measurement.PackageMeasurementTaskService runtime=1653552505760 retry_strategy={"maximum_backoff_seconds":{"3600":0},"initial_backoff_seconds":{"30":0},"retry_policy":{"0":0}} preferred_network_type=1 required_idleness_state=0 preferred_charging_state=1 last_runtime=0 period=875000 task_type=0 job_id=-1 user_id=0 android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (code 2067) at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method) at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:780) at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471) at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341) at aqui.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):175) at aqtk.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):182) at aqtk.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):23) at aqtk.a(:com.google.android.gms@202414022@20.24.14 (040700-319035315):177) at aqpu.run(:com.google.android.gms@202414022@20.24.14 (040700-319035315):9) at soy.b(:com.google.android.gms@202414022@20.24.14 (040700-319035315):12) at soy.run(:com.google.android.gms@202414022@20.24.14 (040700-319035315):7) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at sux.run(:com.google.android.gms@202414022@20.24.14 (040700-319035315):0) at java.lang.Thread.run(Thread.java:818)
試したこと
- connectDrive内のコメントアウトしている//backupFile()のタイミングで処理を行った時は希望通りの処理が行われます。
- 分からないながらもLogを埋め込みcoroutineを使ったりしてみましたが実現できませんでした。
- 現在、ログ内容から認証される前にアップロード処理が走ってしまい、ファイルがアップロードされていないのではと考えています。
(そのため、認証後となる2回目はアップロードされると予想しています。)
補足情報(FW/ツールのバージョンなど)
アプリ内で撮影した写真データをバックアップしたく、初めてGoogle Driveの操作に挑戦しています。
(バックアップ自体は「Google Drive内」と「端末内」で選択できる仕様を考えています。)
試行錯誤のため根本的な間違いをしていたらすみません。
よろしくお願いします。
まだ回答がついていません
会員登録して回答してみよう