- この記事は、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 | |
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 | |
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 | |
application/pdf | ||
Presentations | MS PowerPoint | application/vnd.openxmlformats-officedocument.presentationml.presentation |
Open Office presentation | application/vnd.oasis.opendocument.presentation | |
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からアプリケーションを起動することに加えて、アプリケーションは、アプリ内からコンテンツを選択するためにファイルピッカーを表示することができます。 詳細については、ファイルピッカーガイドを参照してください。