2023年6月20日火曜日

Google Drive api v3で例外発生

久しぶりに、はまりました。自分でも忘れないように残しておきます。


機能の更新のついでにSDKを33に、gradle-wrapper.propetiesを8.0に上げて、リリース前に念のため、releaseモードで動かしてみたら、Google Drive api V3を使用したバックアップと復元がエラーとなってしまうことに気付きました。

例外の内容は以下です。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "The request is missing a valid API key.",
    "reason" : "forbidden"
  } ],
  "message" : "The request is missing a valid API key.",
  "status" : "PERMISSION_DENIED"
}

API keyなんていままで使っていなかったので、この例外の意味は分かりませんでした。

しかし、releaseモードだけでおかしくなるのは、大抵は、難読化が原因です。


結論から書くと、proguard-rules.proに以下を追加すれば、正常に動作します。
-keep class com.google.api.services.drive.** {*;}
-keep class com.google.api.client.http.HttpHeaders {*;}



1行目は以前から記述していたのですが、今回2行目を追加しました。ここに行きつくのは結構大変でした。

まずは、世界中の誰かが解決していれば楽なので、ネット検索したのですが、見つかりませんでした。

例外の内容に従って、API keyを作成して、設定してみましたが、新たな例外になってしまいました。

あるいは、drive.files.list()等の実行時にトークンが消えているようなので、drive.files.list()実行時にトークンを渡してみると動くが、ダウンロードを行う以下の部分が違うエラーになってしまいました。
drive.files().get(fileId).executeMediaAndDownloadTo()

その他にも四苦八苦したのですが埒が明かないので、大変面倒くさいですが、debugモードとreleaseモードでデバッグをして、ライブラリ内の変数の中身を比較することにしました。
releaseモードでのデバッグは、appのbuild.gradleのbuildTypesのreleaseに以下を追加でできます。

buildTypes {
    release {
        :
        debuggable true
        :
    }
}

そして、com.google.api.client.http.HttpHeaders関連がreleaseモードでは、空になっている部分があり、そのせいで、トークンが消えていたことが分かりました。
proguard-rules.proに前述のkeepの行を追加して動かすと、バックアップも復元も全て正常に動作しました。

以上です。


2023年5月12日金曜日

フローティングメモのメモとウェブ追加

本ページでは、Androidのアプリの「フローティングメモ」に、メモ・ウェブの追加・変更をパソコンで行います。
本機能をご利用になるためには、「フローティングメモ」で定期購入とバックアップの設定を行う必要があります。
また、変更は、あらかじめ「フローティングメモ」の通常の画面で変更したいメモまたはウェブを長押しすると表示される操作選択画面で【PCで編集】を選択してデータを送信する必要があります。

分類、タイトル、内容の入力後、【入力したデータをアップロード】をクリックして下さい。
アップロード後、「フローティングメモ」の最初の画面でメニューの【同期】をタップすると取り込まれます。