Android - Google Drive SDK - 打开文件

时间:2016-08-29 22:17:52

标签: android google-drive-api google-drive-android-api

我习惯使用下一个代码在我的应用中打开文件:

public void openFile(@NonNull String uri) {
    checkNotNull(uri);
    File file = new File(uri);

    String dataType = null;
    if (ContentTypeUtils.isPdf(uri)) dataType = "application/pdf";
    else if (ContentTypeUtils.isImage(uri)) dataType = "image/*";

    if (file.exists() && dataType != null) {
        Intent target = new Intent(Intent.ACTION_VIEW);

        target.setDataAndType(Uri.fromFile(file), dataType);
        target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

        Intent intent = Intent.createChooser(target, "Open file");
        try {
            startActivity(intent);
        } catch (ActivityNotFoundException e) {
            e.printStackTrace();
            Log.e(TAG, "There is a problem when opening the file :(");
        }
    } else {
        Toast.makeText(getContext(), "Invalido", Toast.LENGTH_LONG).show();
    }
}

我一直使用静态文件,所以这已经足够了,但现在我正在使用Google Drive SDK for Android。我拥有我要打开的文件的driveId,但问题是我找不到一个干净的方法来打开我得到的文件内容:

Drive.DriveApi.fetchDriveId(mGoogleApiClient, documentFile.getDriveId())
            .setResultCallback(driveIdResult -> {
                PendingResult<DriveApi.DriveContentsResult> open =
                        driveIdResult.getDriveId().asDriveFile().open(
                        mGoogleApiClient,
                        DriveFile.MODE_READ_ONLY,
                        null);

                open.setResultCallback(result -> {
                    DriveContents contents = result.getDriveContents();
                    InputStream inputStream = contents.getInputStream();
                    // I know I can get the input stream, and use it to write a new file.

                });
            });

因此,我想到的唯一一件事就是创建一个静态路由,每次打开它时都会创建一个文件,并在每次打开一个新文件时删除它。

到目前为止,我所了解的是,Google Drive API for Android已经保存了该文件的实例,因此我想到的内容听起来没必要,我想知道是否有更好的方法来实现这一点。有没有办法可以打开文件,并以更清洁的方式执行与Intent.ACTION_VIEW类似的操作?

提前致谢。

1 个答案:

答案 0 :(得分:0)

好吧,因为似乎无法回答我会发布我所做的事情。我所做的只是创建一个临时文件,我将我的内容读取。我仍然不知道这是否是最好的选择,所以这个问题仍然会被打开以获得更好的答案。

open.setResultCallback(result -> {
                DriveContents contents = result.getDriveContents();
                InputStream inputStream = contents.getInputStream();
                writeTempFile(inputStream);
            });

这里是writeTempFile

的实施
private synchronized File writeTempFile(@NonNull InputStream inputStream) {
    checkNotNull(inputStream);
    File filePath = new File(mActivity.getFilesDir(), "TempFiles");
    if (!filePath.exists()) filePath.mkdirs();
    File file = new File(filePath, TEMP_FILE);
    try {
        OutputStream outputStream = new FileOutputStream(file);
        IOUtils.copyLarge(inputStream, outputStream);
        IOUtils.closeQuietly(inputStream);
        IOUtils.closeQuietly(outputStream);
    } catch (IOException e) {
        e.printStackTrace();
    }

    return file;
}