如何在没有 DriveId 的情况下从 App 文件夹 google 驱动器读取文件?

How to read file from App folder google drive without DriveId?

我有功能并且工作正常!但它绕过驱动器 ID?如果驱动器 ID 被删除或销毁怎么办!

他们有什么方法可以找到驱动器 ID 吗?

我在这种情况下遇到了困难

  1. 用户重新加入我的应用程序或更换设备[​​=23=]
  2. 如果我错过了共享首选项中的驱动器 ID

============================================= ========== 我的工作功能

 readFromGooDrive(DriveId mDriveId) {
      byte[] buf = null;
      if (getGoogleApiClient() != null && getGoogleApiClient().isConnected()) try {
        DriveFile df = Drive.DriveApi.getFile(getGoogleApiClient(), mDriveId);
        df.open(getGoogleApiClient(), DriveFile.MODE_READ_ONLY, null)
          .setResultCallback(new ResultCallback<DriveContentsResult>() {
          @Override
          public void onResult(DriveContentsResult driveContentsResult) {
            if ((driveContentsResult != null) && driveContentsResult.getStatus().isSuccess()) {
              DriveContents contents = driveContentsResult.getDriveContents();
                BufferedInputStream bis = new BufferedInputStream(contents.getInputStream());
                byte[] buffer = new byte[1024];
                int bytesread = 0;
                FileOutputStream outStream;
                try
                {
                    String databasePath = getBaseContext().getDatabasePath("my database").getPath();
                    outStream = new FileOutputStream(databasePath);
                    while( (bytesread = bis.read(buffer)) != -1)
                    {
                        outStream.write(buffer,0,bytesread);
                    }

                    outStream.flush();
                    bis.close();
                    outStream.close();
                }
                catch (FileNotFoundException e)
                {
                    Log.i(TAG,e.getMessage());
                }
                catch (IOException e)
                {
                    Log.i(TAG,e.getMessage());
                }
                finally {
                    Toast.makeText(getBaseContext(),"Data from Google Drive restored successfully." , Toast.LENGTH_LONG).show();
                }
                contents.discard(getGoogleApiClient());
            }
          }
        });
      } catch (Exception e) { e.printStackTrace(); }
    }

你只需要复制文件..它工作完美兄弟

private static final String TAG = "EditContentsActivity";

@Override
public void onConnected(Bundle connectionHint) {
    super.onConnected(connectionHint);

    Query query = new Query.Builder()
            .addFilter(Filters.contains(SearchableField.TITLE, "New file2.txt"))
            .build();
    Drive.DriveApi.query(getGoogleApiClient(), query)
            .setResultCallback(metadataCallback);


}

public class EditContentsAsyncTask extends ApiClientAsyncTask<DriveFile, Void, Boolean> {

    public EditContentsAsyncTask(Context context) {
        super(context);
    }

    @Override
    protected Boolean doInBackgroundConnected(DriveFile... args) {
        DriveFile file = args[0];
        try {
            DriveContentsResult driveContentsResult = file.open(
                    getGoogleApiClient(), DriveFile.MODE_WRITE_ONLY, null).await();
            if (!driveContentsResult.getStatus().isSuccess()) {
                return false;
            }
            DriveContents driveContents = driveContentsResult.getDriveContents();
            OutputStream outputStream = driveContents.getOutputStream();
            outputStream.write("New file2.txt".getBytes());
            com.google.android.gms.common.api.Status status =
                    driveContents.commit(getGoogleApiClient(), null).await();
            return status.getStatus().isSuccess();
        } catch (IOException e) {
            Log.e(TAG, "IOException while appending to the output stream", e);
        }
        return false;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if (!result) {
            showMessage("Error while editing contents");
            return;
        }
        showMessage("Successfully edited contents");
    }
}

final private ResultCallback<DriveApi.MetadataBufferResult> metadataCallback =
        new ResultCallback<DriveApi.MetadataBufferResult>() {
            @Override
            public void onResult(DriveApi.MetadataBufferResult result) {
                if (!result.getStatus().isSuccess()) {
                    showMessage("Problem while retrieving results");
                    return;
                }
                MetadataBuffer mdb = null;
                try {
                    mdb = result.getMetadataBuffer();
                    for (Metadata md : mdb) {
                        if (md == null || !md.isDataValid() || md.isTrashed()) continue;
                        // collect files
                        DriveId driveId = md.getDriveId();
                        String dId = driveId.encodeToString();
                        Log.i("checking",""+dId);
                        String mime = md.getMimeType();
                        String name=md.getTitle();
                        if(name.equals("New file2.txt")){
                            Log.i("checking2",""+dId);
                            Log.i("checking3",""+driveId.getResourceId());
                            Drive.DriveApi.fetchDriveId(getGoogleApiClient(), driveId.getResourceId())
                                    .setResultCallback(idCallback);
                            break;
                        }
                        //.....
                    }
                } finally { if (mdb != null) mdb.close(); }

            }
        };

final ResultCallback<DriveIdResult> idCallback = new ResultCallback<DriveIdResult>() {
    @Override
    public void onResult(DriveIdResult result) {
        if (!result.getStatus().isSuccess()) {
            showMessage("Cannot find DriveId. Are you authorized to view this file?");
            return;
        }
        DriveId driveId = result.getDriveId();
        DriveFile file = driveId.asDriveFile();
        new EditContentsAsyncTask(EditContentActivity.this).execute(file);
    }
};