質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
バックアップ

バックアップとは、保存データやプログラムの複製を異なる記録装置などへ保存することを言います。バックアップを取っておくことで、機器のトラブルでデータが損傷するなどの不測の事態にもデータを複製することが可能です。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

受付中

Google Driveへのアップロードが正しくできない

bluvenz
bluvenz

総合スコア16

バックアップ

バックアップとは、保存データやプログラムの複製を異なる記録装置などへ保存することを言います。バックアップを取っておくことで、機器のトラブルでデータが損傷するなどの不測の事態にもデータを複製することが可能です。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

1回答

0評価

0クリップ

155閲覧

投稿2022/05/26 08:20

編集2022/05/27 01:43

前提

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内」と「端末内」で選択できる仕様を考えています。)
試行錯誤のため根本的な間違いをしていたらすみません。

よろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

バックアップ

バックアップとは、保存データやプログラムの複製を異なる記録装置などへ保存することを言います。バックアップを取っておくことで、機器のトラブルでデータが損傷するなどの不測の事態にもデータを複製することが可能です。

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。