我习惯使用下一个代码在我的应用中打开文件:
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
类似的操作?
提前致谢。
答案 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;
}