広島、晴れのち晴れ

FlutterでGoogle Driveを使ったバックアップ

&NewLine;<p>Flutterに限りませんが、<strong>Google Driveを使用してアプリケーション領域にバックアップ、リストアをしたい<&sol;strong>場合、色々と設定がややこしくて詰まるので、自分用の備忘録として確認すべき項目をリスト化しておきます。<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p>他の人にも役立てば幸いです。<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<hr class&equals;"wp-block-separator has-alpha-channel-opacity"&sol;>&NewLine;&NewLine;&NewLine;&NewLine;<h2 class&equals;"wp-block-heading">自分のPC<&sol;h2>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>keytoolが使用できる事(自分の場合、パスが通っていないので&lbrack;Java &gt&semi; jdk-xxx &gt&semi; bin&rsqb;&lpar;keytool&period;exeがあるフォルダ&rpar;まで移動)<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>コマンドでデバッグキーストアの取得<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code has-background" style&equals;"border-style&colon;none&semi;border-width&colon;0px&semi;background-color&colon;&num;ececec"><code>keytool -list -v -alias androiddebugkey -keystore C&colon;&bsol;Users&bsol;YOUR&lowbar;USERNAME&bsol;&period;android&bsol;debug&period;keystore&NewLine;&NewLine;&ast; &&num;91&semi;YOUR&lowbar;USERNAME&rsqb; 自分のユーザー名&NewLine;&ast; &&num;91&semi;キーストアのパスワード&rsqb; 通常は「android」<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>表示された「SHA-1」&lpar;<em><mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key1<&sol;mark><&sol;em>&rpar;と「SHA-256」&lpar;<em><mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key2<&sol;mark><&sol;em>&rpar;をコピペしておく<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>コマンドでリリースキーストアの作成と取得<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code has-background" style&equals;"background-color&colon;&num;ececec"><code>keytool -genkey -v -keystore my-release-key&period;keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000&NewLine;&NewLine;&ast; &&num;91&semi;my-release-key&period;keystore&rsqb; 生成されるキーストアの名前&NewLine;&ast; &&num;91&semi;my-key-alias&rsqb; キーエイリアスの名前<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>キーストアのパスワードとキーエイリアスのパスワードを設定後、名前、組織部署、組織名&lpar;会社名&rpar;、都市名&lpar;市&rpar;、州&lpar;県&rpar;、国コード&lpar;JP&rpar;を入力して、&lbrack;はい&rsqb;でキーストアの作成<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>コマンドで作成したキーストアのフィンガープリントを取得<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code has-background" style&equals;"background-color&colon;&num;ececec"><code>keytool -list -v -alias my-key-alias -keystore my-release-key&period;keystore&NewLine;&NewLine;&ast; &&num;91&semi;my-key-alias&rsqb; 先程の作成したキーエイリアスの名前&NewLine;&ast; &&num;91&semi;my-release-key&period;keystore&rsqb; 先程の作成したキーストアの名前<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>キーストアのパスワードとキーエイリアスのパスワードを入力して、表示された「SHA-1」&lpar;<em><mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key3<&sol;mark><&sol;em>&rpar;と「SHA-256」&lpar;<em><mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key4<&sol;mark><&sol;em>&rpar;をコピペしておく<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<h2 class&equals;"wp-block-heading">Google Play<&sol;h2>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>アプリの登録(大前提)(テスト公開でOK&rpar;<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;設定 &gt&semi; アプリの署名&rsqb;から「SHA-1 証明書のフィンガープリント」&lpar;<em><mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key5<&sol;mark><&sol;em>&rpar;「SHA-256 証明書のフィンガープリント」&lpar;<em><mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key6<&sol;mark><&sol;em>&rpar;を取得<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<h2 class&equals;"wp-block-heading">Firebase<&sol;h2>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>プロジェクトの作成(大前提)<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>アプリの追加&lpar;Android&rpar;<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;Authentication &gt&semi; Sign-in method&lpar;ログイン方法&rpar;&rsqb;のログインプロバイダで「Google」を有効にする<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;プロジェクトの概要 &gt&semi; プロジェクトの設定&rsqb;もしくは&lbrack;プロジェクト &gt&semi; アプリ&rsqb;を選択<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;マイアプリ&rsqb;のアプリを選択して「フィンガープリントを追加」する&lpar;<em><mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key1<&sol;mark>&comma; <mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key2<&sol;mark>&comma; <mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key3<&sol;mark>&comma; <mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key4<&sol;mark>&comma; <mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key5<&sol;mark>&comma; <mark style&equals;"background-color&colon;&num;9DFF20" class&equals;"has-inline-color">key6<&sol;mark><&sol;em>&rpar;<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>google-services&period;jsonをダウンロードしておく<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<h2 class&equals;"wp-block-heading">Google Cloud<&sol;h2>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>プロジェクトの作成(大前提)<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;ナビゲーションメニュー &gt&semi; APIとサービス &gt&semi; ライブラリ&rsqb;に移動<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>「Google Drive」を検索して、「Google Drive API」を有効にする<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;APIとサービス &gt&semi; OAuth 同意画面&rsqb;に移動<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;公開ステータス&rsqb;は「テスト」&lpar;公開したら本番環境へ)<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;ユーザーの種類&rsqb;は「外部」<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;スコープの設定&rsqb;は「Google Drive」で検索して「&&num;8230&semi;&sol;auth&sol;drive&period;file」と「&&num;8230&semi;&sol;auth&sol;drive&period;appdata」を追加<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<h2 class&equals;"wp-block-heading">Flutter<&sol;h2>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>(ここからルートはアプリのトップディレクトリ)<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;android&sol;app&rsqb;にgoogle-services&period;jsonを追加<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&lbrack;android&sol;build&period;gradle&rsqb;に以下を追加<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code"><code> dependencies &lbrace;&NewLine; &period;&period;&period;&NewLine;&NewLine; &sol;&sol; versionはその都度合わせる&NewLine; classpath 'com&period;google&period;gms&colon;google-services&colon;4&period;3&period;15'&NewLine; &rcub;&NewLine;<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>&lbrack;android&sol;app&sol;build&period;gradle&rsqb;に以下を追加<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code"><code>plugins &lbrace;&NewLine; &period;&period;&period;&NewLine; id 'com&period;google&period;gms&period;google-services'&NewLine;&rcub;&NewLine;dependencies &lbrace;&NewLine; &period;&period;&period;&NewLine; implementation&lpar;platform&lpar;"com&period;google&period;firebase&colon;firebase-bom&colon;32&period;7&period;0"&rpar;&rpar;&NewLine; implementation&lpar;"com&period;google&period;firebase&colon;firebase-analytics"&rpar;&NewLine; implementation&lpar;"com&period;google&period;firebase&colon;firebase-auth"&rpar;&NewLine; implementation&lpar;"com&period;google&period;firebase&colon;firebase-firestore"&rpar;&NewLine;&rcub;&NewLine;<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list">&NewLine;<li>「flutter pub add」コマンドで必要なパッケージを取得<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&nbsp&semi; google&lowbar;sign&lowbar;in<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>  firebase&lowbar;core<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>  firebase&lowbar;auth<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&nbsp&semi; flutter&lowbar;secure&lowbar;storage<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&nbsp&semi; googleapis<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>&nbsp&semi; googleapis&lowbar;auth<&sol;li>&NewLine;&NewLine;&NewLine;&NewLine;<li>  http<&sol;li>&NewLine;<&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<h2 class&equals;"wp-block-heading">Flutterでの接続について<&sol;h2>&NewLine;&NewLine;&NewLine;&NewLine;<p>設定はGoogle Play&comma; Firebase&comma; Google Cloudがちゃんとしていれば大丈夫のはずです。下はバックアップ、リストア、削除のクラス&lpar;google&lowbar;drive&lowbar;api&period;dart&rpar;です。<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p>&ast;参考サイト「<a href&equals;"https&colon;&sol;&sol;qiita&period;com&sol;YuKiO-OO&sol;items&sol;67b471e6be6c4c4c26e9" target&equals;"&lowbar;blank" rel&equals;"noreferrer noopener">【Flutter】GoogleDriveへのバックアップ・リストア機能を実装するまでの道のり<&sol;a>」<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code has-border-color has-cyan-bluish-gray-border-color has-background has-small-font-size" style&equals;"border-width&colon;1px&semi;background-color&colon;&num;e4e4e4&semi;padding-top&colon;var&lpar;--wp--preset--spacing--30&rpar;&semi;padding-right&colon;var&lpar;--wp--preset--spacing--30&rpar;&semi;padding-bottom&colon;var&lpar;--wp--preset--spacing--30&rpar;&semi;padding-left&colon;var&lpar;--wp--preset--spacing--30&rpar;"><code>import 'dart&colon;async'&semi; &NewLine;import 'package&colon;google&lowbar;sign&lowbar;in&sol;google&lowbar;sign&lowbar;in&period;dart'&semi; &NewLine;import 'package&colon;googleapis&sol;drive&sol;v3&period;dart' as ga&semi; &NewLine;import 'package&colon;http&sol;io&lowbar;client&period;dart'&semi; &NewLine;import 'package&colon;http&sol;http&period;dart' as http&semi; &NewLine;import 'package&colon;path&sol;path&period;dart' as path&semi; &NewLine;import 'dart&colon;io' as io&semi; &NewLine; &NewLine;class GoogleApi &lbrace; &NewLine; Future&lt&semi;bool> uploadFileToGoogleDrive&lpar;&rpar; async &lbrace; &NewLine; bool isUpload &equals; false&semi; &NewLine; final completer &equals; Completer&lt&semi;bool>&lpar;&rpar;&semi; &NewLine; &NewLine; try &lbrace; &NewLine; GoogleSignIn googleSignIn &equals; GoogleSignIn&lpar; &NewLine; scopes&colon; &&num;91&semi; &NewLine; 'https&colon;&sol;&sol;www&period;googleapis&period;com&sol;auth&sol;drive&period;file'&comma; &NewLine; 'https&colon;&sol;&sol;www&period;googleapis&period;com&sol;auth&sol;drive&period;appdata'&comma; &NewLine; &rsqb;&comma; &NewLine; &rpar;&semi; &NewLine; GoogleSignInAccount&quest; googleSignInAccount &equals; await googleSignIn&period;signIn&lpar;&rpar;&semi; &NewLine; &NewLine; if &lpar;googleSignInAccount &excl;&equals; null&rpar; &lbrace; &NewLine; var client &equals; GoogleHttpClient&lpar;await googleSignInAccount&period;authHeaders&rpar;&semi; &NewLine; var drive &equals; ga&period;DriveApi&lpar;client&rpar;&semi; &NewLine; ga&period;FileList list &equals; await drive&period;files&period;list&lpar;spaces&colon; 'appDataFolder'&comma; &dollar;fields&colon; 'files&lpar;id&comma; name&comma; modifiedTime&rpar;'&rpar;&semi; &NewLine; &NewLine; &sol;&sol; Google Driveに残っているアプリフォルダ内のデータを削除しておく &NewLine; if &lpar;list&period;files &excl;&equals; null &amp&semi;&amp&semi; list&period;files&excl;&period;isNotEmpty&rpar; &lbrace; &NewLine; for &lpar;var i &equals; 0&semi; i &lt&semi; list&period;files&excl;&period;length&semi; i&plus;&plus;&rpar; &lbrace; &NewLine; String&quest; gdId &equals; list&period;files&excl;&&num;91&semi;i&rsqb;&period;id&semi; &NewLine; if &lpar;gdId &excl;&equals; null&rpar; &lbrace; &NewLine; await drive&period;files&period;delete&lpar;gdId&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; &NewLine; &rcub; &NewLine; &NewLine; ga&period;File fileToUpload &equals; ga&period;File&lpar;&rpar;&semi; &NewLine; &NewLine; String dbPath &equals; "ファイルのフルパス"&semi; &NewLine; if &lpar;io&period;File&lpar;dbPath&rpar;&period;existsSync&lpar;&rpar;&rpar; &lbrace; &NewLine; io&period;File dbFile &equals; io&period;File&lpar;dbPath&rpar;&semi; &NewLine; &NewLine; fileToUpload&period;parents &equals; &&num;91&semi;"appDataFolder"&rsqb;&semi; &NewLine; fileToUpload&period;modifiedTime &equals; DateTime&period;now&lpar;&rpar;&semi; &NewLine; fileToUpload&period;name &equals; path&period;basename&lpar;dbFile&period;path&rpar;&semi; &NewLine; await drive&period;files&period;create&lpar; &NewLine; fileToUpload&comma; &NewLine; uploadMedia&colon; ga&period;Media&lpar;dbFile&period;openRead&lpar;&rpar;&comma; await dbFile&period;length&lpar;&rpar;&rpar;&comma; &NewLine; &rpar;&semi; &NewLine; isUpload &equals; true&semi; &NewLine; completer&period;complete&lpar;isUpload&rpar;&semi; &NewLine; &rcub; else &lbrace; &NewLine; &sol;&sol; バックアップするファイルが見つかりません &NewLine; completer&period;complete&lpar;isUpload&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; else &lbrace; &NewLine; &sol;&sol; Googleのサインインに失敗しました &NewLine; completer&period;complete&lpar;isUpload&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; catch &lpar;e&rpar; &lbrace; &NewLine; &sol;&sol; エラー &NewLine; completer&period;completeError&lpar;e&rpar;&semi; &NewLine; &rcub; &NewLine; &NewLine; return completer&period;future&semi; &NewLine; &rcub; &NewLine; &NewLine; Future&lt&semi;bool> downloadGoogleDriveFile&lpar;&rpar; async &lbrace; &NewLine; bool isDownload &equals; false&semi; &NewLine; final completer &equals; Completer&lt&semi;bool>&lpar;&rpar;&semi; &NewLine; &NewLine; try &lbrace; &NewLine; GoogleSignIn googleSignIn &equals; GoogleSignIn&lpar; &NewLine; scopes&colon; &&num;91&semi; &NewLine; 'https&colon;&sol;&sol;www&period;googleapis&period;com&sol;auth&sol;drive&period;file'&comma; &NewLine; 'https&colon;&sol;&sol;www&period;googleapis&period;com&sol;auth&sol;drive&period;appdata'&comma; &NewLine; &rsqb;&comma; &NewLine; &rpar;&semi; &NewLine; GoogleSignInAccount&quest; googleSignInAccount &equals; await googleSignIn&period;signIn&lpar;&rpar;&semi; &NewLine; &NewLine; if &lpar;googleSignInAccount &excl;&equals; null&rpar; &lbrace; &NewLine; var client &equals; GoogleHttpClient&lpar;await googleSignInAccount&period;authHeaders&rpar;&semi; &NewLine; var drive &equals; ga&period;DriveApi&lpar;client&rpar;&semi; &NewLine; &NewLine; &sol;&sol; Google Driveのアプリフォルダに保存されている一つ目のデータを取得 &NewLine; ga&period;FileList list &equals; await drive&period;files&period;list&lpar;spaces&colon; 'appDataFolder'&comma; &dollar;fields&colon; 'files&lpar;id&comma; name&comma; modifiedTime&rpar;'&rpar;&semi; &NewLine; String&quest; gdID &equals; &lpar;list&period;files &excl;&equals; null &amp&semi;&amp&semi; list&period;files&excl;&period;isNotEmpty&rpar; &quest; list&period;files&excl;&period;first&period;id &colon; ""&semi; &NewLine; &NewLine; if &lpar;gdID &excl;&equals; null &amp&semi;&amp&semi; gdID&period;isNotEmpty&rpar; &lbrace; &NewLine; ga&period;Media file &equals; await drive&period;files&period;get&lpar;gdID&comma; downloadOptions&colon; ga&period;DownloadOptions&period;fullMedia&rpar; as ga&period;Media&semi; &NewLine; &NewLine; String dbPath &equals; "ファイルのフルパス"&semi; &NewLine; io&period;File dbFile &equals; io&period;File&lpar;dbPath&rpar;&semi; &NewLine; &NewLine; List&lt&semi;int> dataStore &equals; &&num;91&semi;&rsqb;&semi; &NewLine; file&period;stream&period;listen&lpar;&lpar;data&rpar; &lbrace; &NewLine; dataStore&period;insertAll&lpar;dataStore&period;length&comma; data&rpar;&semi; &NewLine; &rcub;&comma; onDone&colon; &lpar;&rpar; &lbrace; &NewLine; dbFile&period;writeAsBytes&lpar;dataStore&rpar;&semi; &NewLine; isDownload &equals; true&semi; &NewLine; completer&period;complete&lpar;isDownload&rpar;&semi; &NewLine; &rcub;&comma; onError&colon; &lpar;error&rpar; &lbrace; &NewLine; &sol;&sol; エラー &NewLine; completer&period;completeError&lpar;error&rpar;&semi; &NewLine; &rcub;&rpar;&semi; &NewLine; &NewLine; &rcub; else &lbrace; &NewLine; &sol;&sol; ダウンロードするデータが見つかりませんでした &NewLine; completer&period;complete&lpar;isDownload&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; else &lbrace; &NewLine; &sol;&sol; Googleのサインインに失敗しました &NewLine; completer&period;complete&lpar;isDownload&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; catch &lpar;e&rpar; &lbrace; &NewLine; &sol;&sol; エラー &NewLine; completer&period;completeError&lpar;e&rpar;&semi; &NewLine; &rcub; &NewLine; &NewLine; return completer&period;future&semi; &NewLine; &rcub; &NewLine; &NewLine; &sol;&sol; バックアップデータの削除 &NewLine; Future&lt&semi;bool> deletedGoogleDriveFile&lpar;&rpar; async &lbrace; &NewLine; bool isDelete &equals; false&semi; &NewLine; final completer &equals; Completer&lt&semi;bool>&lpar;&rpar;&semi; &NewLine; &NewLine; try &lbrace; &NewLine; GoogleSignIn googleSignIn &equals; GoogleSignIn&lpar; &NewLine; scopes&colon; &&num;91&semi; &NewLine; 'https&colon;&sol;&sol;www&period;googleapis&period;com&sol;auth&sol;drive&period;file'&comma; &NewLine; 'https&colon;&sol;&sol;www&period;googleapis&period;com&sol;auth&sol;drive&period;appdata'&comma; &NewLine; &rsqb;&comma; &NewLine; &rpar;&semi; &NewLine; GoogleSignInAccount&quest; googleSignInAccount &equals; await googleSignIn&period;signIn&lpar;&rpar;&semi; &NewLine; &NewLine; if &lpar;googleSignInAccount &excl;&equals; null&rpar; &lbrace; &NewLine; var client &equals; GoogleHttpClient&lpar;await googleSignInAccount&period;authHeaders&rpar;&semi; &NewLine; var drive &equals; ga&period;DriveApi&lpar;client&rpar;&semi; &NewLine; ga&period;FileList list &equals; await drive&period;files&period;list&lpar;spaces&colon; 'appDataFolder'&comma; &dollar;fields&colon; 'files&lpar;id&comma; name&comma; modifiedTime&rpar;'&rpar;&semi; &NewLine; &NewLine; &sol;&sol; Google Driveに残っているアプリフォルダ内のデータを削除しておく &NewLine; if &lpar;list&period;files &excl;&equals; null &amp&semi;&amp&semi; list&period;files&excl;&period;isNotEmpty&rpar; &lbrace; &NewLine; for &lpar;var i &equals; 0&semi; i &lt&semi; list&period;files&excl;&period;length&semi; i&plus;&plus;&rpar; &lbrace; &NewLine; String&quest; gdId &equals; list&period;files&excl;&&num;91&semi;i&rsqb;&period;id&semi; &NewLine; if &lpar;gdId &excl;&equals; null&rpar; &lbrace; &NewLine; await drive&period;files&period;delete&lpar;gdId&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; &NewLine; &rcub; &NewLine; isDelete &equals; true&semi; &NewLine; completer&period;complete&lpar;isDelete&rpar;&semi; &NewLine; &rcub; else &lbrace; &NewLine; &sol;&sol; Googleのサインインに失敗しました &NewLine; completer&period;complete&lpar;isDelete&rpar;&semi; &NewLine; &rcub; &NewLine; &rcub; catch &lpar;e&rpar; &lbrace; &NewLine; &sol;&sol; エラー &NewLine; completer&period;completeError&lpar;e&rpar;&semi; &NewLine; &rcub; &NewLine; &NewLine; return completer&period;future&semi; &NewLine; &rcub; &NewLine;&rcub; &NewLine; &NewLine;class GoogleHttpClient extends IOClient &lbrace; &NewLine; final Map&lt&semi;String&comma; String> &lowbar;headers&semi; &NewLine; GoogleHttpClient&lpar;this&period;&lowbar;headers&rpar; &colon; super&lpar;&rpar;&semi; &NewLine; &commat;override &NewLine; Future&lt&semi;IOStreamedResponse> send&lpar;http&period;BaseRequest request&rpar; &equals;> super&period;send&lpar;request&period;&period;headers&period;addAll&lpar;&lowbar;headers&rpar;&rpar;&semi; &NewLine; &commat;override &NewLine; Future&lt&semi;http&period;Response> head&lpar;Uri url&comma; &lbrace;Map&lt&semi;String&comma; String>&quest; headers&rcub;&rpar; &lbrace; &NewLine; headers &equals; headers &quest;&quest; &lbrace;&rcub;&semi; &NewLine; headers&period;addAll&lpar;&lowbar;headers&rpar;&semi; &NewLine; return super&period;head&lpar;url&comma; headers&colon; headers&rpar;&semi; &NewLine; &rcub; &NewLine;&rcub; <&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p>使う場合は下みたいな感じで。<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-code has-border-color has-cyan-bluish-gray-border-color has-background has-small-font-size" style&equals;"border-width&colon;1px&semi;background-color&colon;&num;e4e4e4&semi;padding-top&colon;var&lpar;--wp--preset--spacing--30&rpar;&semi;padding-right&colon;var&lpar;--wp--preset--spacing--30&rpar;&semi;padding-bottom&colon;var&lpar;--wp--preset--spacing--30&rpar;&semi;padding-left&colon;var&lpar;--wp--preset--spacing--30&rpar;"><code>import 'package&colon;notebook&sol;google&lowbar;drive&lowbar;api&period;dart'&semi;&NewLine;&NewLine;&sol;&sol; こんな感じで使うか&NewLine;bool isUpload&equals; await GoogleApi&lpar;&rpar;&period;uploadFileToGoogleDrive&lpar;&rpar;&semi;&NewLine;message &equals; &lpar;isUpload&rpar; &quest; "バックアップ成功" &colon; "バックアップ失敗"&semi;&NewLine;&NewLine;&sol;&sol; こんな感じで使う&NewLine;GoogleApi&lpar;&rpar;&period;uploadFileToGoogleDrive&lpar;&rpar;&period;then&lpar;&lpar;bool isUpload&rpar; &lbrace;&NewLine; var message &equals; &lpar;isUpload&rpar; &quest; "バックアップ成功" &colon; "バックアップ失敗"&semi;&NewLine;&rcub;&rpar;&semi;&NewLine;<&sol;code><&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p>これで上手くいきました。<br>ちなみにここまでBingと二人三脚でやりました。Bing、めちゃくちゃ優秀です。<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<hr class&equals;"wp-block-separator has-alpha-channel-opacity"&sol;>&NewLine;&NewLine;&NewLine;&NewLine;<p>ここまでやって接続できない、エラーが出る人は私にとっても勉強になるので教えてください。<&sol;p>&NewLine;

モバイルバージョンを終了