如何使用android api下载google驱动器文件

如何使用android api下载google驱动器文件,android,google-drive-api,google-drive-android-api,Android,Google Drive Api,Google Drive Android Api,以下程序将显示google drive中的“与您共享的文件”。我在列表视图中显示所有文件,在这里,每当用户单击列表项时,我都要下载google驱动器文件,并且我已经编写了获取文件驱动器id的代码 这就是我在下面代码中所做的 请帮助我在用户使用google drive android api单击列表项时从google drive下载文件 public class MainActivity extends BaseDemoActivity{ private static final String

以下程序将显示google drive中的“与您共享的文件”。我在列表视图中显示所有文件,在这里,每当用户单击列表项时,我都要下载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());
            }
        };  
public类MainActivity扩展了BaseDemoActivity{
私有静态最终字符串TAG=“MainActivity”;
私有列表视图mResultsListView;
私有结果适配器mResultsAdapter;
私人ProgressBar mProgressBar;
私有驱动器ID mSelectedFileDriveId;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResultsListView=(ListView)findViewById(R.id.listViewSamples);
mResultsAdapter=新结果适配器(此);
设置适配器(mResultsAdapter);
mResultsListView.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
如果(mSelectedFileDriveId!=null){
open();
返回;
}
}
});
}
私隐无效公开(){
显示消息(“选择文件驱动器id=“+mSelectedFileDriveId”);
//重新设置进度对话框回零,因为我们正在
//启动开放请求。
//mProgressBar.setProgress(0);
DownloadProgressListener=新建DownloadProgressListener(){
@凌驾
public void onProgress(已下载长字节,预期为长字节){
//使用最新进度更新进度对话框。
int进度=(int)(字节下载*100/字节预期);
Log.d(TAG,String.format(“加载进度:%d%,进度”);
mProgressBar.setProgress(进度);
}
};
Drive.DriveApi.getFile(getGoogleAppClient(),mSelectedFileDriveId)
.open(getGoogleAppClient(),DriveFile.MODE\u READ\u WRITE,侦听器)
.setResultCallback(DriveContentScalBack);
mSelectedFileDriveId=null;
}
私有结果回调驱动器contentscallback=
新的ResultCallback(){
@凌驾
public void onResult(DriveContentsResult结果){
如果(!result.getStatus().issucess()){
showMessage(“打开文件内容时出错”);
返回;
}
showMessage(“打开的文件内容”);
}
};
/**
*清除结果缓冲区,以避免在活动停止后立即发生内存泄漏
*用户可见。
*/
@凌驾
受保护的void onStop(){
super.onStop();
mResultsAdapter.clear();
}
@凌驾
未连接的公共无效(捆绑连接提示){
super.onConnected(connectionHint);
Drive.DriveApi.requestSync(getGoogleAppClient())
.setResultCallback(状态回调);
showMessage(“连接…”);
}
最终私有结果回调状态回调=
新的ResultCallback(){
@凌驾
公共void onResult(状态arg0){
//TODO自动生成的方法存根
showMessage(“获取…”);
if(arg0.getStatus().issucess()){
Query Query=new Query.Builder()
.addFilter(Filters.sharedWithMe())
.build();
Drive.DriveApi.query(getGoogleAppClient(),query)
.setResultCallback(metadataCallback);
}否则{
showMessage(“Error=“+arg0”);
}
}
};
最终私有结果Callback metadataCallback=
新的ResultCallback(){
@凌驾
public void onResult(DriveApi.MetadataBufferResult结果){
//TODO自动生成的方法存根
showMessage(“onResult…”);
如果(!result.getStatus().issucess()){
showMessage(“检索结果时出现问题”);
返回;
}
mResultsAdapter.clear();
追加(result.getMetadataBuffer());
MetadataBuffer buffer=result.getMetadataBuffer();
元数据meta=buffer.get(0);
Log.v(标记,“WEB内容链接=“+meta.getWebContentLink());
mSelectedFileDriveId=(DriveId)meta.getDriveId();
showMessage(“Count=“+mResultsAdapter.getCount());
}
};  

}

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

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


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

请查看以下中的Google Drive Android API示例:

RetrieveContentsActivity代码向您展示了如何将文件内容获取到InputStreamReader中

要运行示例,您必须在中注册一个新应用程序

启用googledriveapi

要使用此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

更多信息请点击此处:

谢谢你,里韦罗。要使用谷歌硬盘服务,我必须通过我的gmail帐户登录。如果我将WebContentLink传递到浏览器,它会要求我进行身份验证,但我已经在应用程序中验证了我的帐户