Google Drive Rest API for Android 文件选取器是Google提供的一种让Android应用能够安全访问用户Google Drive文件的方式,而无需应用处理用户认证或请求文件权限。它提供了一个标准的UI界面让用户选择文件,并返回应用可以访问的文件URI。
implementation 'com.google.android.gms:play-services-drive:17.0.0'
// 在Activity或Fragment中
private static final int REQUEST_CODE_OPEN = 1;
private void openFilePicker() {
Intent pickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
pickerIntent.addCategory(Intent.CATEGORY_OPENABLE);
pickerIntent.setType("*/*"); // 所有文件类型,也可以指定如"image/*"
// 可选:限制为Google Drive文件
pickerIntent.putExtra(Intent.EXTRA_LOCAL_ONLY, false);
startActivityForResult(pickerIntent, REQUEST_CODE_OPEN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_OPEN && resultCode == RESULT_OK) {
Uri uri = data.getData();
// 处理选中的文件URI
handleSelectedFile(uri);
}
}
private void handleSelectedFile(Uri uri) {
try {
// 获取文件输入流
InputStream inputStream = getContentResolver().openInputStream(uri);
// 读取文件内容或执行其他操作
// ...
} catch (IOException e) {
e.printStackTrace();
}
}
private static final int REQUEST_CODE_CREATE = 2;
private void createFilePicker() {
Intent createIntent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
createIntent.addCategory(Intent.CATEGORY_OPENABLE);
createIntent.setType("text/plain"); // 文件类型
createIntent.putExtra(Intent.EXTRA_TITLE, "newfile.txt"); // 默认文件名
startActivityForResult(createIntent, REQUEST_CODE_CREATE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_CREATE && resultCode == RESULT_OK) {
Uri uri = data.getData();
// 写入新文件内容
writeFileContent(uri);
}
}
private void writeFileContent(Uri uri) {
try {
OutputStream outputStream = getContentResolver().openOutputStream(uri);
String content = "这是新文件的内容";
outputStream.write(content.getBytes());
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
原因:Android的权限系统限制了对URI的长期访问 解决方案:获取持久化权限
// 在onActivityResult中
if (uri != null) {
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(uri, takeFlags);
}
原因:直接读取大文件可能导致内存问题 解决方案:使用分块读取或后台线程处理
private void handleLargeFile(Uri uri) {
new AsyncTask<Uri, Void, Void>() {
@Override
protected Void doInBackground(Uri... uris) {
try {
InputStream inputStream = getContentResolver().openInputStream(uris[0]);
BufferedInputStream bis = new BufferedInputStream(inputStream);
byte[] buffer = new byte[8192]; // 8KB缓冲区
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
// 处理每一块数据
}
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}.execute(uri);
}
原因:Intent设置不正确 解决方案:明确指定MIME类型
// 只选择图片
pickerIntent.setType("image/*");
// 或多种类型
pickerIntent.setType("image/*|application/pdf");
通过使用Google Drive Rest API的文件选择器,开发者可以轻松集成Google Drive功能,同时确保用户数据的安全性和隐私保护。
没有搜到相关的沙龙