Drive UIの "Open with" コンテキストメニューと統合する



  • この記事は、Google Drive™ APIに関する記事を和訳したものです。
  • 原文: Integrate with Drive UI "Open with" context menu
  • 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
  • 自己責任でご利用ください。
  • 和訳した時期は 2019年6月ころです。

Google Drive UIは、ファイルを開くための 2つの方法を提供します:

  • Open withコンテキストメニューアイテム
  • ファイルを開くための Google Pickerダイアログ

これらの UI機能の外観を確認するには、Driveプラットフォームを用いて何をすることができますか? の概要をチェックしてください。 このページの残りの部分では、Google Driveに格納されたファイルを開くために、あなたのアプリをこれらの Drive UI機能と統合する方法について説明します。

Open withコンテキストメニューを使用してファイルを開く

ユーザが Google Driveにてファイルを選択し、Open withメニューオプションを選択したとき、Driveは、ユーザを、選択されたアプリケーションのための Open URLにリダイレクトします(この URLは、Driveプラットフォームを有効にするときに定義されます)。 ユーザのブラウザからリダイレクトされたリクエストは、stateパラメータ内に次の重要な情報を含んでいます:

  • 開くためのファイルの ids(あるいは、ネイティブな Googleドキュメントを開くとき、exportIds)
  • action、それは、openにセットされています。
  • 認証されたユーザの userId

stateパラメータの代わりに、リクエスト URLを構築するために、テンプレート変数置換を使用することを選択するかもしれません。

ファイルのメタデータをフェッチし、ファイルコンテンツをダウンロードするために、ファイル IDが必要となるでしょう。 stateパラメータは URLエンコードされているので、エスケープ文字を処理し、JSONとしてそれをパースする必要があるでしょう。 JSON記法では、Open withのための state情報は、次のようになります:

{
  "ids": ["0Bz0bd"],
  "action":"open",
  "userId":"103354693083460731603"
}

ひとたびそれがファイル IDおよびアクセストークンを持ったならば、アプリは、files.getのリファレンスドキュメントに記載されているように、パーミッションをチェックし、ファイルのメタデータをフェッチし、ファイルコンテンツをダウンロードすることができます。

あなたのアプリにて Google Docsを開き、変換する

Importオプションを使用すると、あなたのアプリに Google Doc形式をインポートすることができます。 APIコンソールにて、Drive API内の Drive UI Integrationタブから Importを有効にすると、あなたのアプリは Google Doc形式から任意のサポートされた MIMEタイプに変換することができます。 ユーザが Open withオプションをトリガすると、Google Driveは、アプリが開くことができる MIMEタイプを評価し(登録時に設定)、アプリがインポートすることができる形式のリストを推定します。 可能な形式は、選択のためにユーザに提示されます。

Google Doc形式およびサポートされるエクスポート MIMEタイプは、次のように相互にマッピングされます:

Google Doc形式 変換形式 対応する MIMEタイプ
Documents HTML text/html
HTML (zipped) application/zip
Plain text text/plain
Rich text application/rtf
Open Office doc application/vnd.oasis.opendocument.text
PDF application/pdf
MS Word document application/vnd.openxmlformats-officedocument.wordprocessingml.document
EPUB application/epub+zip
Spreadsheets MS Excel application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Open Office sheet application/x-vnd.oasis.opendocument.spreadsheet
PDF application/pdf
CSV (first sheet only) text/csv
TSV (first sheet only) text/tab-separated-values
HTML (zipped) application/zip
Drawings JPEG image/jpeg
PNG image/png
SVG image/svg+xml
PDF application/pdf
Presentations MS PowerPoint application/vnd.openxmlformats-officedocument.presentationml.presentation
Open Office presentation application/vnd.oasis.opendocument.presentation
PDF application/pdf
Plain text text/plain
Apps Scripts JSON application/vnd.google-apps.script+json

about resourceは、それぞれのファイルタイプのために利用可能なエクスポート形式についての追加の情報を含んでいます。

ユーザが Drive Docの Open with コンテキストメニューからアプリを選択したとき、Google Driveは、ユーザを、選択されたアプリケーションのための Open URLにリダイレクトさせます。 ユーザのブラウザからリダイレクトされたリクエストは、stateパラメータ内に、次の重要な情報を含んでいます:

  • action、それは、openにセットされています。
  • 使用するための exportIds

ひとたびそれがエクスポート IDを持つならば、アプリは、必要に応じて、MIMEタイプを判断するためにファイルのメタデータをフェッチする可能性があります。

さらには、アプリは、files.exportメソッドを用いて、変換されたファイルコンテンツをダウンロードすることもできます。

Java

String fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo";
OutputStream outputStream = new ByteArrayOutputStream();
driveService.files().export(fileId, "application/pdf")
    .executeMediaAndDownloadTo(outputStream);

Python

file_id = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo'
request = drive_service.files().export_media(fileId=file_id,
                                             mimeType='application/pdf')
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print "Download %d%%." % int(status.progress() * 100)

PHP

$fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo';
$response = $driveService->files->export($fileId, 'application/pdf', array(
    'alt' => 'media'));
$content = $response->getBody()->getContents();

.NET

var fileId = "1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo";
var request = driveService.Files.Export(fileId, "application/pdf");
var stream = new System.IO.MemoryStream();
// Add a handler which will be notified on progress changes.
// It will notify on each chunk download and when the
// download is completed or failed.
request.MediaDownloader.ProgressChanged +=
        (IDownloadProgress progress) =>
{
    switch (progress.Status)
    {
        case DownloadStatus.Downloading:
            {
                Console.WriteLine(progress.BytesDownloaded);
                break;
            }
        case DownloadStatus.Completed:
            {
                Console.WriteLine("Download complete.");
                break;
            }
        case DownloadStatus.Failed:
            {
                Console.WriteLine("Download failed.");
                break;
            }
    }
};
request.Download(stream);

Ruby

file_id = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo'
content = drive_service.export_file(file_id,
                                    'application/pdf',
                                    download_dest: StringIO.new)

Node.js

var fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo';
var dest = fs.createWriteStream('/tmp/resume.pdf');
drive.files.export({
  fileId: fileId,
  mimeType: 'application/pdf'
})
    .on('end', function () {
      console.log('Done');
    })
    .on('error', function (err) {
      console.log('Error during download', err);
    })
    .pipe(dest);

Objective-C

NSString *fileId = @"1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo";

GTLRDriveQuery_FilesExport *query = [GTLRDriveQuery_FilesExport queryForMediaWithFileId:fileId
                                                                               mimeType:@"application/pdf"];
[driveService executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
                                                     GTLRDataObject *file,
                                                     NSError *error) {
    if (error == nil) {
        NSLog(@"Downloaded %lu bytes", (unsigned long)file.data.length);
    } else {
        NSLog(@"An error occurred: %@", error);
    }
}];

アプリは読み取り専用として変換されたファイルを表示する、あるいは、ユーザにそれらを新しいファイルとして保存させるべきです。

ファイルピッカーを使用する

Google Driveからアプリケーションを起動することに加えて、アプリケーションは、アプリ内からコンテンツを選択するためにファイルピッカーを表示することができます。 詳細については、ファイルピッカーガイドを参照してください。