如何从没有DriveId的App文件夹谷歌驱动器中读取文件?

时间:2016-09-26 05:44:31

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

我有功能,工作正常!但它通过Drive id?如果Drive id被删除或销毁怎么办?

是他们找到驱动器ID的任何方法吗?

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

  1. 用户重新加入我的应用或更改设备
  2. 如果我从共享偏好中错过了我的驱动器ID
  3. =============================================== ======== 我的工作功能

     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(); }
        }
    

1 个答案:

答案 0 :(得分:0)

你只需要复制文件..它的工作完美了

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