0
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; 
}} 

我要在安裝應用程序時,創建一個文件夾,比得到它的ID,並將其保存到sharedprefrences..after,我想創建該文件夾中的文件folderId但當我使用通過該文件夾ID創建文件裏面它比說 「找不到DriveId。您有權限查看此文件嗎?」不能得到,我只是谷歌創建驅動

如果我使用result.getDriveFolder().getDriveId().getResourceId() 以獲得比它總是空的id。
我使用此代碼首先創建文件夾,我貼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我保存和傳遞它來創建文件功能。

回答

8

請勿將DriveId與ResourceId混合使用。兩者看起來都像字符串,但DriveId與ResourceId不同。見SO 21800257。此外,ResourceId不立即可用,請參閱SO 22874657

驅動器Id通常是這樣的:

「驅動器Id:CAESHDBCMW1RVblahblahblahblahMYjAUgssy8yYFRTTNKRU55」

而RESOURCEID更像是:

「UW2ablahblaghblahNy00Ums0B1mQ」

更新:

既然有這麼多的開發人員來解決這個問題,我會盡我所能詳細闡述。

 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進行本地通信,也可以緩存它等。
  • 按照丹尼爾在SO 21800257中的評論(上面的鏈接),不要依靠DriveId作爲常量字符串, 它應該改變對象合作mmitted。使用DriveId.equals()(我沒有測試過)
  • 無論何時,當你走出本地設備(Drive web界面,其他應用程序,YourApp在不同的 設備上)時,都需要使用ResourceId,它是唯一的驅動器上的唯一ID(在雲端:-)。
  • ResourceId可用於您的AFTER GooPlaySvcs將對象提交給驅動器。有 強制它的方法,但它是一個不同的故事(搜索requestSync())。
  • 如果你決定要搶RESOURCEID並使用它來調用REST類型(delete/trash),意識到一個事實,即谷歌Play服務的傳播上,你就不用管了 了(所以它似乎是一個時間表的變化 ,請再次查看requestSync()問題),而您的REST/GDAA戰鬥會導致您的數據損壞 。 GDAA(GooPlayServices)可能暫時不會意識到您的REST更改。您有 可以自己管理同步。我承認當我嘗試時我失敗了。

    好運

+0

非常感謝你幫助了很多。 – 2015-03-16 17:25:31