The sky is the limit

Vue.js、PHP、Java、Cordova、Monacaを中心にハイブリッドアプリ開発、PWA開発など効率的なWEB、iOS、Androidアプリ開発の情報を共有します。

Androidアプリ開発 GoogleAPI連携 the name must not be empty: null

Androidアプリ開発 GoogleAPI連携 the name must not be empty: null

f:id:duo-taro100:20160218004611p:plain

目次

AndroidアプリデータのバックアップにGoogleDriveを使う

Androidアプリの開発でGoogleDriveにバックアップファイルを作成するという実装を行いました。
バックアップ実装内容の詳細は後日記載しますが、ここではハマった現象をお伝えしたいと思います。

今回やったことは、アプリデータをzipファイルにしてGoogleDriveにアップロードするというものです。
使用したのはDrive API REST version 2です。
最新のversion 3を使用していないのでご注意ください。

developers.google.com

ローカル開発環境で正しくバックアップファイルのアップロードとダウンロードができたので、他のメンバーに確認してもらったら動きませんでした。
最初にアカウント選択画面が表示されて、選択まではできる。
でも、アップロードするとエラーが起きてしまうという形でした。

f:id:duo-taro100:20160404001647p:plain

the name must not be empty: nullというエラー

エラー内容は「the name must not be empty: null」でした。

以下のような状況でした。
・同一Googleアカウントで実験した時に、エミュレータでは動かず、実機では動く
同一Googleアカウントで試したところ、あるエミュレータでは正しく動かず、ある実機では正しく動くことを確認しました。
このことからアカウントごとの(設定など)問題ではないと判断しました。

・一部実機では正常に動く、動かない実機もある
実機確認を行いましたが、正しく動くものとそうでないものがありました。
このことからエミュレータでは動かないというものを排除し、デバイスのAPI、targetバージョンなどが原因ではないかと考えました。

デバックの結果、
GoogleAccountCredential.javaのgetToken()内部でエラーが吐かれていました。
このgetToken()の中では、accountNameを使っており、それがnullだよとのことです。

原因は、account情報を正しく取得できていないことです。
developer.android.com

こちらのページに記載がありましたね。

Note: Beginning with Android 6.0 (API level 23), if an app shares the signature of the authenticator that manages an account, it does not need "GET_ACCOUNTS" permission to read information about that account. On Android 5.1 and lower, all apps need "GET_ACCOUNTS" permission to read information about any account.


・対応策
AndridManifest.xmlに以下の一文を追加しましょう。

<uses-permission android:name="android.permission.GET_ACCOUNTS"/>

以上です。