当前位置: 首页 > 知识库问答 >
问题:

无法获得我刚刚在google drive上创建的文件夹ID

谢弘阔
2023-03-14
public class Helpers  extends Activity implements
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {
SharedPreferences preferences;

private static final String TAG = "BaseDriveActivity";

public static  String EXISTING_FOLDER_ID;


protected static final int REQUEST_CODE_RESOLUTION = 1;

protected static final int NEXT_AVAILABLE_REQUEST_CODE = 2;

public static final String folderId = "FOLDER_ID";
public static final String fileName = "folderId";

private GoogleApiClient mGoogleApiClient;


@Override
protected void onResume() {
    super.onResume();
    if (mGoogleApiClient == null) {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .addScope(Drive.SCOPE_APPFOLDER) // required for App Folder sample
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }
    mGoogleApiClient.connect();
}

@Override
protected void onActivityResult(int requestCode, int resultCode,
                                Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_RESOLUTION && resultCode == RESULT_OK) {
        mGoogleApiClient.connect();
    }
}

@Override
protected void onPause() {
    if (mGoogleApiClient != null) {
        mGoogleApiClient.disconnect();
    }
    super.onPause();
}

final ResultCallback<DriveFolder.DriveFolderResult> callback = new ResultCallback<DriveFolder.DriveFolderResult>() {
    @Override
    public void onResult(DriveFolder.DriveFolderResult result) {
        if (!result.getStatus().isSuccess()) {
            showMessage("Error while trying to create the folder");
            return;
        }

        EXISTING_FOLDER_ID = result.getDriveFolder().getDriveId().toString();
        showMessage("Created a folder: " + result.getDriveFolder().getDriveId().toString());

        preferences = getSharedPreferences(fileName , MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(folderId , EXISTING_FOLDER_ID );
        editor.apply();
    }
};

public  void mcreateFolder() {

    MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
            .setTitle("SmsSync").build();
    Drive.DriveApi.getRootFolder(getGoogleApiClient()).createFolder(
            getGoogleApiClient(), changeSet).setResultCallback(callback);

}

@Override
public void onConnected(Bundle bundle) {
    Log.i(TAG, "GoogleApiClient connected");
    preferences = getSharedPreferences(fileName , MODE_PRIVATE);
    EXISTING_FOLDER_ID = preferences.getString(folderId ,null);
    if (EXISTING_FOLDER_ID == null ) {
        mcreateFolder();

    }

}

@Override
public void onConnectionSuspended(int cause) {
    Log.i(TAG, "GoogleApiClient connection suspended");
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    Log.i(TAG, "GoogleApiClient connection failed: " + result.toString());
    if (!result.hasResolution()) {
        // show the localized error dialog.
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show();
        return;
    }
    try {
        result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);
    } catch (IntentSender.SendIntentException e) {
        Log.e(TAG, "Exception while starting resolution activity", e);
    }
}

public void showMessage(String message) {
    Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}

public GoogleApiClient getGoogleApiClient() {
    return mGoogleApiClient;
}}

如果我使用result.getDriveFolder().getDriveID().getResourceID()获取id,那么它总是为null。
我首先使用此代码创建文件夹,并将其粘贴到https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/createFolderActivity.java

为了在文件夹中创建文件,我使用以下指南https://github.com/googledrive/android-demos/blob/master/src/com/google/android/gms/drive/sample/demo/createFileInFolderActivity.java
传递我保存的FolderID并将其传递到创建文件函数。

共有1个答案

刘向阳
2023-03-14

不要将DriveId与ResourceID混用。两者看起来都像字符串,但DriveId与ResourceID不同。参见SO21800257。另外,ResourceId并不是立即可用的,请参见SO 22874657。

DriveId通常看起来像:

“DriveID:caeshdbcmw1rvblahblahblahblahmyjaugssy8yyfrttnkru55”

由于许多开发人员都在争论这个问题,所以我将尽可能深入地阐述我的知识。

     Google Drive             Google Play Svcs      YourApp
   (up in the cloud)         (on your device)      (on your device)
  +--------------------+      +--------------+     +--------------+         
  | 'id' (RESTful API) | - - -> ResourceId  - - - -> ResourceId   |
  +--------------------+      |  DriveId    - - - -> DriveId      |
                              +--------------+     +--------------+

我试图用上面的艺术表达来传达的是:

>

  • 当您在设备上创建驱动器对象(文件夹/文件)时,GooPlaySvcs将给您驱动器ID
  • 您可以使用此DriveId与GooPlaySvcs进行本地通信,也可以缓存它,等等。
  • 根据Daniel在SO 21800257(上面的链接)中的注释,不要依赖于DriveId是一个常量字符串,它应该随着提交的对象而改变。使用driveId.equals()(我没有测试)
  • 无论何时您走出本地设备(在不同设备上驱动web接口、其他应用程序、YourApp),都需要使用ResourceId,这是驱动器上唯一唯一的ID(在云中:-)。
  • 在GooPlaySvcs将对象提交到驱动器后,ResourceId可供您使用。有一些强制执行的方法,但这是另一回事(搜索requestSync())。
  • 如果您决定获取ResourceId并将其用于RESTfull调用(删除/垃圾),请注意以下事实:Google Play Services按照您无法控制的计划传播其更改(似乎是这样,请再次查看requestSync()问题),并且REST/GDAA冲突可能会对数据造成损害。GDAA(GooPlayServices)可能有一段时间不知道您的REST更改。您必须自己管理同步。我承认我尝试的时候失败得很惨。

  •  类似资料:
    • assertEquals(“Amsterdam,Noord-Holland”,Driver.FindElement(by.id(“van”)).getText()); 然而,这导致: org.junit.comparisonfailure:预期:<[荷兰阿姆斯特丹]>但实际:<[]> 所以看起来比较失败是正确的,但我不知道为什么我不能断言我在屏幕上看到的东西。 我正在使用Java、Selenium

    • 如何检索刚刚在数据库中创建的id,当我按下“保存”按钮时,数据被创建,我想从该数据中检索id 这是我的控制器代码 我想找回刚刚创建的数据的id

    • 问题内容: 我正在使用Python和psycopg2连接到Postgres。 当我插入一行时… …如何获取刚刚插入的行的ID?试: 使用时返回错误: 简单地返回。 更新:也是(即使直接在postgres中使用此命令也可以): 有人可以建议吗? 谢谢! 问题答案: 并且,请不要手动构建包含值的SQL字符串。您可以(并且应该!)单独传递值,从而不必进行转义和SQL注入: 有关更多详细信息,请参见psy

    • 问题内容: 我已经开始执行以下代码 现在,我需要知道我刚刚开始的进程的pid。 问题答案: 由于Java 9类具有新方法long pid(),因此它很简单

    • 问题内容: 我的开发电话正在运行。 在我的应用程序中,我试图在外部存储上创建一个文件夹,该文件夹将存储我的应用程序的调试信息。基本上,它将包含应用程序执行的所有命令,因此,当用户遇到问题时,我可以选择使它们从debug文件夹发送信息给我进行分析。 我首先尝试将文件写入文件夹,但发现创建文件夹时出错。最初,我使用,然后又移至也不起作用。 我有我的清单。 这是用于创建文件夹的代码: 这是我也尝试过的:

    • 问题内容: 我试图用Golang程序抛出错误,但同时也没有打印出运行行。无法访问名为log.Fatal的行号吗?即有没有办法在抛出错误时获取行号? 我试图用谷歌搜索,但不确定如何。我能得到的最好的结果是打印堆栈跟踪信息,我认为这很好,但可能有点过多。我也不想每次都需要行号时就写东西,我只是感到惊讶,没有任何内置函数可以用于这种或非服装的东西。 另外,我不想制作自己的调试/错误处理工具的原因是,我不