【问题标题】:How to download google drive files using android api如何使用android api下载谷歌驱动器文件
【发布时间】:2014-11-20 11:28:14
【问题描述】:

以下程序将显示来自 google drive 的“与您共享的文件”。我在 listView 中显示所有文件,在这里我想在用户单击列表项时下载 google 驱动器文件,并且我编写了代码来获取文件的驱动器 ID。

这就是我在下面的代码中所做的。

每当用户使用 google drive android api 单击列表项时,请帮助我从 google drive 下载文件。

public class MainActivity extends BaseDemoActivity{ 
private static final String TAG = "MainActivity";
private ListView mResultsListView;
private ResultsAdapter mResultsAdapter;
private ProgressBar mProgressBar;
private DriveId mSelectedFileDriveId;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mResultsListView = (ListView) findViewById(R.id.listViewSamples);
    mResultsAdapter = new ResultsAdapter(this);
    mResultsListView.setAdapter(mResultsAdapter);

    mResultsListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
                 if (mSelectedFileDriveId != null) {
                        open();
                        return;
                    }
            }


    });
}
private void open() {
    showMessage("Select files drive id = "+mSelectedFileDriveId);
    // Reset progress dialog back to zero as we're
    // initiating an opening request.
   // mProgressBar.setProgress(0);
    DownloadProgressListener listener = new DownloadProgressListener() {
        @Override
        public void onProgress(long bytesDownloaded, long bytesExpected) {
            // Update progress dialog with the latest progress.
            int progress = (int)(bytesDownloaded*100/bytesExpected);
            Log.d(TAG, String.format("Loading progress: %d percent", progress));
            mProgressBar.setProgress(progress);
        }
    };

    Drive.DriveApi.getFile(getGoogleApiClient(), mSelectedFileDriveId)
        .open(getGoogleApiClient(), DriveFile.MODE_READ_WRITE, listener)
        .setResultCallback(driveContentsCallback);
    mSelectedFileDriveId = null;

}

private ResultCallback<DriveContentsResult> driveContentsCallback =
        new ResultCallback<DriveContentsResult>() {
    @Override
    public void onResult(DriveContentsResult result) {
        if (!result.getStatus().isSuccess()) {
            showMessage("Error while opening the file contents");
            return;
        }
        showMessage("File contents opened");       
    }
};

/**
 * Clears the result buffer to avoid memory leaks as soon as the activity is no longer
 * visible by the user.
 */
@Override
protected void onStop() {
    super.onStop();
    mResultsAdapter.clear();
}

@Override
public void onConnected(Bundle connectionHint) {
    super.onConnected(connectionHint); 
   Drive.DriveApi.requestSync(getGoogleApiClient())
   .setResultCallback(statusCallback);
    showMessage("Connecting ...");
}

final private ResultCallback<Status> statusCallback =
        new ResultCallback<Status>() {
            @Override
            public void onResult(Status arg0) {
                // TODO Auto-generated method stub
             showMessage("Fetching...");
             if(arg0.getStatus().isSuccess()){
                 Query query = new Query.Builder()
                    .addFilter(Filters.sharedWithMe())
                    .build();

                 Drive.DriveApi.query(getGoogleApiClient(), query)
                 .setResultCallback(metadataCallback);
             }else{
                 showMessage("Error = "+arg0);
             }
        }
};

final private ResultCallback<DriveApi.MetadataBufferResult> metadataCallback = 
        new ResultCallback<DriveApi.MetadataBufferResult>() {
            @Override
            public void onResult(DriveApi.MetadataBufferResult result) {
                // TODO Auto-generated method stub
                showMessage("onResult ...");
                if (!result.getStatus().isSuccess()) {
                    showMessage("Problem while retrieving results");
                    return;
                }
                mResultsAdapter.clear();
                mResultsAdapter.append(result.getMetadataBuffer());
                MetadataBuffer buffer = result.getMetadataBuffer();
                Metadata meta = buffer.get(0);
                Log.v(TAG,"WEB CONTENT LINK = "+meta.getWebContentLink());
                mSelectedFileDriveId = (DriveId) meta.getDriveId();
                showMessage("Count = "+mResultsAdapter.getCount());
            }
        };  

}

【问题讨论】:

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


    【解决方案1】:

    由于 API 中没有直接下载文件的特定方法,因此有两种解决方法可以完成此操作:

    a) 通过调用 getFile() 方法创建一个 DriveFile 对象。然后,使用 java.io.InputStream 库打开文件,并将此流转换为本地文件。有关此资源的更多信息:https://developers.google.com/drive/android/files

    b) 使用元数据 WebContentLink,通过浏览器上的意图或通过 WebView 访问该 URL。您可能需要再次进行身份验证。在浏览器上打开文件应该会提示下载请求。

    【讨论】:

    • 谢谢里维罗。要使用 google drive 服务,我必须通过我的 gmail 帐户登录。如果我将 WebContentLink 传递给浏览器,它应该要求我进行身份验证,但我已经在应用程序中验证了我的帐户。有什么方法可以从我的应用程序为浏览器设置身份验证?
    【解决方案2】:

    查看 Google Drive Android API 示例:

    https://github.com/googledrive/android-demos

    RetrieveContentsActivity 代码向您展示了如何将文件内容放入 InputStreamReader。

    要运行示例,您必须在

    中注册一个新应用

    https://console.developers.google.com/

    启用 Google Drive API。

    要使用此 API,您需要在 Credentials / OAuth(在 Google 控制台中)中创建一个新的客户端 ID。

    您需要使用 keytool 生成 SHA1 密钥并将其粘贴到那里。

    Windows 示例:

    C:\Program Files\Java\jre1.8.0_40\bin>keytool -exportcert -alias androiddebugkey
     -keystore C:\Users\yourusername\.android\debug.keystore -list -v
    

    更多信息在这里:https://developers.google.com/drive/android/files

    【讨论】:

      猜你喜欢
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多