Android Drive API无效的父文件夹错误

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

我使用 Android Drive Api 将我的文件上传到云端硬盘。我在 Google 云端硬盘根目录上创建了一个文件夹(“NewFolder”),并使用以下代码从 Android 应用程序在我的“NewFolder”中创建了一个内部文件夹(“InnerFolder”)。然后我将我的文件从我的 android 应用程序写入这个“InnerFolder”。

我的应用程序仅在第一次安装在我的设备上时创建“InnerFolder”。然后卸载并重新安装应用程序将不会再次创建文件夹(在本地文件中存储创建的文件夹驱动器 ID(如 DriveId:yrjundeen12cnfe))。

我的代码在第一次安装时运行良好。但是如果我多次卸载并重新安装应用程序并尝试在 Google Drive 上上传,我会在 createFile 的回调方法中收到错误消息“无效的父文件夹”。

首次文件夹创建代码:

private void createGalleryFolder() {
        DriveFolder folder = Drive.DriveApi.getRootFolder(googleApiClient);
        MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                .setTitle(AppConstants.DEFAULT_GALLERY_NAME).build();
        folder.createFolder(googleApiClient, changeSet).setResultCallback(
                createRootFolderCallback);
}

        final ResultCallback<DriveFolderResult> createRootFolderCallback = new ResultCallback<DriveFolderResult>() {

    @Override
    public void onResult(DriveFolderResult result) {
        if (!result.getStatus().isSuccess()) {
            showError();
            return;
        }

        // Root folder created Successfully
        DriveId mFolderDriveId = result.getDriveFolder().getDriveId();

        AppUtilities.saveOnLocalFile(mFolderDriveId, AppConstants.ROOT_FOLDER_ID_FILE);

        if (!deviceID.equalsIgnoreCase("")) {
            DriveFolder folder = Drive.DriveApi.getFolder(googleApiClient,
                    result.getDriveFolder().getDriveId());
            MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                    .setTitle(deviceID).build();
            folder.createFolder(googleApiClient, changeSet)
                    .setResultCallback(createInnerFolderCallback);
        } else {

            showError();        }

    }
};

final ResultCallback<DriveFolderResult> createInnerFolderCallback = new ResultCallback<DriveFolderResult>() {

    @Override
    public void onResult(DriveFolderResult result) {
        if (!result.getStatus().isSuccess()) {

            showError();
            return;
        }

        // IMEI folder created successfully inside the Root folder
        DriveId mFolderDriveId = result.getDriveFolder().getDriveId();

        AppUtilities.saveOnLocalFile(mFolderDriveId, AppConstants.INNER_FOLDER_ID_FILE);

        // Success
    }
};

文件上传代码:

private void saveFileToDrive(final Bitmap bitmapToSave,final File imageFile,final String imageName) {

        Drive.DriveApi.newDriveContents(googleApiClient).setResultCallback(driveContentsCallback);
}

final private ResultCallback<DriveContentsResult> driveContentsCallback =
            new ResultCallback<DriveContentsResult>() {
        @Override
        public void onResult(DriveContentsResult result) {

            if(!result.getStatus().isSuccess()){
                Log.i("Test1", "Failed to create new contents");
                return;
            }

            Log.i("Test1", "New contents created");

            //Write image data to OutputStream
            OutputStream outputStream = result.getDriveContents().getOutputStream();
            ByteArrayOutputStream bitmapStream = new ByteArrayOutputStream();
            bitmapToSave.compress(Bitmap.CompressFormat.JPEG, 100, bitmapStream);
            try {
                outputStream.write(bitmapStream.toByteArray());

                DriveFolder folder = Drive.DriveApi.getFolder(googleApiClient, DriveId.decodeFromString(getFolderDriveID()));


                MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                        .setTitle(imageName)
                        .setMimeType("image/jpeg")
                        .setStarred(false).build();

                folder.createFile(googleApiClient, changeSet, result.getDriveContents()).setResultCallback(fileCallback);
            } catch (IOException e) {
                Log.i("Test1","Unable to write file contents");
            }
        }
    };

    final private ResultCallback<DriveFileResult> fileCallback =
            new ResultCallback<DriveFileResult>() {
        @Override
        public void onResult(DriveFileResult result) {
            if (!result.getStatus().isSuccess()) {
                Log.i("Test1","Error while trying to create the file "+result.getStatus().getStatusMessage());
                return;
            }
            Log.i("Test1","Created a file: " + result.getDriveFile().getDriveId());

            result.getDriveFile().getMetadata(googleApiClient).setResultCallback(fileUploadedResultCallback);
        }
    };


    final private ResultCallback<MetadataResult> fileUploadedResultCallback =
            new ResultCallback<MetadataResult>() {
        @Override
        public void onResult(MetadataResult result) {

            if(!result.getStatus().isSuccess()){
                Log.i("Test1", "Failed to upload");
                return;
            }

            Log.i("Test1", "File uploaded");
        }
    };

ResultCallback 错误:

D/dalvikvm(  584): threadid=50: interp stack at 0x549a5000
D/dalvikvm(  584): threadid=50: calling run()
I/Test1   (  813): Image added
--------- beginning of /dev/log/system
D/ActivityThread(  584): SVC-CREATE_SERVICE handled : 0 / CreateServiceData{token=android.os.BinderProxy@415dbf40 className=com.google.android.gms.drive.api.DriveAsyncService packageName=com.google.android.gms intent=null}
D/ActivityThread(  584): SVC-Calling onStartCommand: com.google.android.gms.drive.api.DriveAsyncService@415b6480, flags=2, startId=1
D/ActivityThread(  584): SVC-SERVICE_ARGS handled : 0 / ServiceArgsData{token=android.os.BinderProxy@415dbf40 startId=1 args=Intent { act=com.google.android.gms.drive.EXECUTE pkg=com.google.android.gms }}
W/DataServiceConnectionImpl(  584): Could not find entry, and no valid resource id: DriveId:CAESABgGIMq7nNDgUg==
E/DriveAsyncService(  584): Invalid parent folder.
E/DriveAsyncService(  584): OperationException[Status{statusCode=Invalid parent folder., resolution=null}]
E/DriveAsyncService(  584):     at com.google.android.gms.drive.api.e.e(SourceFile:619)
E/DriveAsyncService(  584):     at com.google.android.gms.drive.api.e.a(SourceFile:458)
E/DriveAsyncService(  584):     at com.google.android.gms.drive.api.a.n.a(SourceFile:82)
E/DriveAsyncService(  584):     at com.google.android.gms.drive.api.a.b.a(SourceFile:27)
E/DriveAsyncService(  584):     at com.google.android.gms.common.service.c.onHandleIntent(SourceFile:60)
E/DriveAsyncService(  584):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
E/DriveAsyncService(  584):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/DriveAsyncService(  584):     at android.os.Looper.loop(Looper.java:154)
E/DriveAsyncService(  584):     at android.os.HandlerThread.run(HandlerThread.java:65)
I/Test1   (  813): Error while trying to create the file Invalid parent folder.

最佳答案

不要依赖GDAA's DriveId 用于超出应用程序和设备范围的驱动器对象(文件/文件夹)的任何缓存或可能寻址。此 ID 来自您设备上的 Google Play 服务实例(因此它甚至在使用相同应用程序的不同设备上都无效 - 即使文件/文件夹在 FILE 范围内仍然可见)。我隐约记得即使在清除 Google Play 服务 (GooPS) 缓存或什至重新安装 GooPS 时,它也会“丢失”。但这可能已经修复。我最后一次接触 GDAA 是在几个月前。

相反,在 RESTFul API 中使用了一个“ResourceId” (称为普通“id”)-参见SO 21800257 .这个字符串唯一代表Drive对象,可以移植到任何地方使用(它甚至是Drive Web界面中HTTP地址的一部分)。
不幸的是,ResourceId 不是立即可用的(直到 GDAA 提交对象)- SO 22432431

祝你好运

关于Android Drive API无效的父文件夹错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27592521/

相关文章:

android - 不使用 BIND_AUTO_CREATE 时 ServiceConnection 泄漏

android - 为 android 构建位置无关的可执行文件时出现问题

android - 在 TextView 中从常规文本动画到粗体

javascript - 转换来自谷歌驱动器的所有 csvs

android:检查谷歌驱动器上是否存在文本文件

android - 可以在同一个项目中使用 google drive REST API 和 Android API 吗?

android - 在 Google 云端硬盘上创建文件夹 (Android)

java - 我在 addOnCompleteListener() Auth Firebase 中得到 isReject() 的原因是什么?

android - Google Play 服务 DriveApi 更改文件父级

google-apps-script - Drive.Files.Copy 和 "parents"不工作