Help us understand the problem. What is going on with this article?

Googleドライブアプリのファイルを他のアプリで編集する

More than 3 years have passed since last update.

最近のアップデートで、Googleドライブアプリが他のアプリでのファイル編集に対応しました。(やっと来た!)


ということでまとめました。

まず、AndroidManifest.xml。

AndroidManifest.xml
<intent-filter>
  <action android:name="android.intent.action.EDIT" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:mimeType="text/*" />
</intent-filter>

ACTION_EDITとmime typeの宣言をします。この宣言のあるアプリが入っている場合、Googleドライブのファイルプレビュー画面に編集ボタン(鉛筆アイコン)が現れます。

Screenshot_20160405-165918.png

ここで編集ボタンを押すと、アプリ選択画面で編集するアプリが選択できます。

Screenshot_20160405-165923.png

getIntent().getData()することで、コンテンツのURIを取得出来ます。(※以下サンプルはkotlinです)

val uri = intent.data

こんな感じのURIが取れます。

uri
content://com.google.android.apps.docs.storage.legacy/enc%3DW1o6eSHXKnQ_fFOnAVPdpG9sVjKLXtVbiJrNIJp-aL8MQcZc%0A

ここで取得するURIは、Googleドライブアプリを終了した後でも、読み書きの両方で有効です。(後からこのurlを使って読み書きが出来ます!)

ファイルのコンテンツは ContentResolver#openInputStream(uri)で取得出来ます。

val input = contentResolver
    .openInputStream(uri)
    .bufferedReader(charset = Charsets.UTF_8)
    .use { 
      it.readText() 
    }

同様に、ContentResolver#openOutputStream(uri)で出力用のストリームが取得出来ます。

contentResolver
    .openOutputStream(uri)
    .bufferedWriter(charset = Charsets.UTF_8)
    .use{ 
      it.write(output) 
    }

入力ファイルのメタデータはコンテントプロバイダから取得出来ます。

val filename = contentResolver.query(uri, null, null, null, null)?.use {
  it.moveToFirst()
  it.getString(it.getColumnIndex(OpenableColumns.DISPLAY_NAME))
}

DatabaseUtils#dumpCursor(cursor)を使えば何が入っているか確認できます。
表示用の名前とかファイルサイズとかmimetypeなどが取得出来ます。

>>>>> Dumping cursor android.content.ContentResolver$CursorWrapperInner@e365673
0 {
   _id=acc=1;doc=6
   document_id=acc=1;doc=6
   _display_name=あああああ.txt
   _size=98
   mime_type=text/plain
   flags=263
   last_modified=1459836680290
   icon=null
}
<<<<<

Screenshot_20160405-165944.png
こんな風に編集すると、
Screenshot_20160405-165951.png
ドライブアプリ上に反映されます。

保存したファイルは、即座にGoogleドライブアプリのプレビューに反映されるので、レスポンスが割といいです。「アプリを選ぶ」ワンアクションが必要ですが、Storage Access Frameworkを使うよりもずっと簡単に実装できます。

サンプルアプリはgithubに上げておきました。
https://github.com/jiro-aqua/TestContentProvider.git

以上です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした