2019年1月27日日曜日

Android 7.0以降だとSAF経由でGoogleDriveへファイル作成ができないことがある

はじめに


最近Androidアプリのメンテナンスをしていなかったので一番の稼ぎ頭であるNudiaの不具合修正を行うことにしたが、結構大変だったので内容を残しておく。

不具合の内容と調査結果


不具合の内容


アプリバージョン 2.3.0でAndroid 7.0以降の端末で作成した画像ファイルをGoogleDrive上に保存しようとすると0 byteの空ファイルができる。

調べてみると、stackoverflowの方に同じ悩みを抱えている人がいたが原因と対策は分かっていない様だった。

調査結果


当初、Android Nougatからアプリ間のファイル共有のポリシーが厳しくなったことにより、プログラム側での処理が足りていないのかと思っていたが、ファイルの保存方法はAndroid公式のSAFに紹介されている手順に従っているため、他に原因があるはずだが全く見当が付かなかった。

そして施行錯誤をする中で、なぜかGoogleDriveを再起動した直後の1回だけ保存が成功することがわかった。

ちなみに公式のSAFのドキュメントでACTION_OPEN_DOCUMENTインテントとACTION_CREATE_DOCUMENTインテントを紹介してCATEGORY_OPENABLEと組み合わせることで次の3パターンのファイルwrite操作が可能になる。


CATEGORY_OPENABLE ありCATEGORY_OPENABLE なし
ACTION_CREATE_DOCUMENT
新規にファイルを作成
空ファイル作成
ACTION_OPEN_DOCUMENT
既存ファイルを上書き


アプリ側ではACTION_CREATE_DOCUMENTとCATEGORY_OPENABLEを指定しているのだが、何故か2回目以降だとCATEGORY_OPENABLEが効いていなかった。
またlogcatでGoogleDriveの動作を監視してみると、再起動直後のみアプリでの保存操作後ActivityManagerから何かしらのIntentがGoogleDriveへ飛んでいることが分かった。
しかしこれ以上の原因については分からなかったため、暫定対応としてAndroid Nougat以上ではGoogleDriveへの保存をさせないように制限を付けることにした。

もし今後さらなる原因がわかったら、恒久的な修正をリリースします。


最後に、これまでアプリをご利用くださっていた方にはご不便をおかけして申し訳ありませんでした。



0 件のコメント:

コメントを投稿