我正在尝试从google驱动器访问所有文件和文件夹到arraya列表。但是我只能从Drive获得一个文件。怎么做从谷歌驱动器获取所有文件和文件夹。我使用以下代码..
由于 阿伦
public void onConnected(Bundle connectionHint) {
// Log.i(TAG, "API client connected.");
Toast.makeText(getActivity(), "Successfully logged in", Toast.LENGTH_LONG).show();
DriveFolder s = Drive.DriveApi.getRootFolder(mGoogleApiClient);
String s1 = (Drive.DriveApi.getRootFolder(mGoogleApiClient)).getDriveId().toString();
DriveId sFolderId2 = DriveId.decodeFromString(s1);
DriveId sFolderId = (Drive.DriveApi.getRootFolder(mGoogleApiClient)).getDriveId();
DriveFolder folder = Drive.DriveApi.getFolder(mGoogleApiClient, sFolderId);
folder.listChildren(mGoogleApiClient).setResultCallback(rootFolderCallback);
// findAll(folder);
}
public ResultCallback<DriveApi.MetadataBufferResult> rootFolderCallback = new
ResultCallback<DriveApi.MetadataBufferResult>() {
@Override
public void onResult(DriveApi.MetadataBufferResult result) {
if (!result.getStatus().isSuccess()) {
return;
}
resultarray = new ArrayList<String>();
int hh = result.getMetadataBuffer().getCount();
for (int i = 0; i < result.getMetadataBuffer().getCount(); i++) {
resultarray.add(result.getMetadataBuffer().get(i).getTitle());
}
Toast.makeText(getActivity(), "Successfully listed files.", Toast.LENGTH_LONG).show();
}
};
答案 0 :(得分:1)
更新(2015年8月25日,美国运动会10:39)
根据您的评论,您有2个选项:
1 /留在GDAA,使用其中一个INTENTS:
- 选择具有开场活动的文件
- 选择一个包含开场白活动的文件夹
请注意,GDAA不会让您的应用看到它没有创建的任何内容(仅限SCOPE_FILE),但它仍允许用户浏览所有内容。如果用户选择了一个文件,它将对您的应用程序可见。我不知道你的应用程序的意图,所以我不能说这种方法是否可用。
2 /使用 DRIVE 范围切换到REST,您的应用会看到所有内容(用户必须事先批准)。可以找到基本的CRUD实现here,但请确保将init()方法的范围更改为&#39; DriveScopes.DRIVE &#39;。
如果您的应用需要迭代文件夹树,在流程中收集文件,那么“testTree()&#39;和&#39; deleteTree()&#39; MainActivity()中的方法就是这样做的。
您也可以继续使用GDAA,并通过添加
为其添加REST功能com.google.api.services.drive.Drive mGOOSvc = new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(),
GoogleAccountCredential.usingOAuth2(appContext, Collections.singletonList(DriveScopes.DRIVE))
.setSelectedAccountName(email)
但是您迟早会遇到由GDAA缓存/延迟引起的problems。
原始回答
尝试这种方法:
private static GoogleApiClient mGAC;
/****************************************************************************
* find file/folder in GOODrive
* @param prnId parent ID (optional), null searches full drive, "root" searches Drive root
* @param titl file/folder name (optional)
* @param mime file/folder mime type (optional)
* @return arraylist of found objects
*/
static void search(String prnId, String titl, String mime) {
if (mGAC != null && mGAC.isConnected()) {
// add query conditions, build query
ArrayList<Filter> fltrs = new ArrayList<>();
if (prnId != null){
fltrs.add(Filters.in(SearchableField.PARENTS,
prnId.equalsIgnoreCase("root") ?
Drive.DriveApi.getRootFolder(mGAC).getDriveId() : DriveId.decodeFromString(prnId)));
}
if (titl != null) fltrs.add(Filters.eq(SearchableField.TITLE, titl));
if (mime != null) fltrs.add(Filters.eq(SearchableField.MIME_TYPE, mime));
Query qry = new Query.Builder().addFilter(Filters.and(fltrs)).build();
// fire the query
Drive.DriveApi.query(mGAC, qry).setResultCallback(new ResultCallback<MetadataBufferResult>() {
@Override
public void onResult(MetadataBufferResult rslt) {
if (rslt != null && rslt.getStatus().isSuccess()) {
MetadataBuffer mdb = null;
try {
mdb = rslt.getMetadataBuffer();
if (mdb != null ) for (Metadata md : mdb) {
if (md == null || !md.isDataValid()) continue;
String title = md.getTitle();
DriveId driveId = md.getDriveId();
//.......
}
} finally { if (mdb != null) mdb.close(); }
}
}
});
}
}
首先使用NULL
调用它搜索(NULL,NULL,NULL)
列出Google云端硬盘中的所有文件。您将看到所有文件您的Android应用程序已创建。 但只有那些 - 文件范围没有看到任何其他内容 如果您需要扫描目录树,您可能会仔细查看此GDAA demo,在MainActivity中,有&#39; testTree()&#39; /&#39; deleteTree()方法递归扫描目录树结构。
另外,您可以查看answer here,它会处理类似的问题(尤其是答案下的评论交换)。
祝你好运
答案 1 :(得分:0)
请注意,您可以使用GDAA检索您从Android设备上传或通过云端硬盘应用下载的文件和文件夹。这是为了获得更高的安全性(由谷歌引用)。
在他的代码中,您需要确保为Google云端硬盘帐户中可能存在的文件尝试所有可能的组合。例如,检查您是否正在跟踪文件或文件夹的父级。如果不满足此条件,您的应用将无法检索这些特定文件。
int[] nums = {35, 21, 5, 6, 55, 7, 42, 165};
boolean[] removed = new boolean[nums.length];
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] > nums[j] && nums[i] % nums[j] == 0) {
removed[j] = true;
} else if (nums[i] < nums[j] && nums[j] % nums[i] == 0) {
removed[i] = true;
}
}
}
for (int i = 0; i < nums.length; ++i) {
if (!removed[i]) {
System.out.print(nums[i] + " ");
}
}
System.out.println();
请参阅完整代码here。