如何在Android集成中从Google云端硬盘获取所选文件路径?

时间:2014-10-09 06:22:30

标签: android google-drive-api

我已成功将GoogleDrive集成到我的Android应用程序中,现在我可以将任何文件从应用程序上传到驱动器。但我想将文件从驱动器下载到设备,我正在使用下面给出的代码 -

import java.net.URI;
import android.content.Intent;
import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.drive.Drive;
import com.google.android.gms.drive.DriveId;
import com.google.android.gms.drive.OpenFileActivityBuilder;

/**
 * An activity to illustrate how to pick a file with the opener intent.
 */
public class PickFileWithOpenerActivity extends BaseDemoActivity {

 private static final String TAG = "PickFileWithOpenerActivity";

 private static final int REQUEST_CODE_OPENER = 1;

 @Override
 public void onConnected(Bundle connectionHint) {
  super.onConnected(connectionHint);
  IntentSender intentSender = Drive.DriveApi
    .newOpenFileActivityBuilder()
    .setMimeType(
      new String[] { "text/plain", "text/html",
        "application/pdf", "audio/mp3", "video/mp4",
        "text/plain", "application/msword",
        "image/jpeg", "image/png", "text/html" })
    .build(getGoogleApiClient());
  try {
   startIntentSenderForResult(intentSender, REQUEST_CODE_OPENER, null,
     0, 0, 0);
  } catch (SendIntentException e) {
   Log.w(TAG, "Unable to send intent", e);
  }

 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  switch (requestCode) {
  case REQUEST_CODE_OPENER:
   if (resultCode == RESULT_OK) {
    DriveId driveId = (DriveId) data
      .getParcelableExtra(OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);
    showMessage("Selected file's ID: " + driveId);

    Uri uri = data.getData();
    try {
     Log.d(TAG, "Drive Id=============== "
       + uri);
    } catch (Exception e) {
     e.printStackTrace();
    }

    // BaseDemoActivity.EXISTING_FILE_ID = driveId.toString();

   }

   finish();
   break;
  default:
   super.onActivityResult(requestCode, resultCode, data);
  }
 }
}

这是BaseDemoActivity

import android.app.Activity;
import android.content.Intent;
import android.content.IntentSender.SendIntentException;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.drive.Drive;

/**
 * An abstract activity that handles authorization and connection to the Drive
 * services.
 */
public abstract class BaseDemoActivity extends Activity implements
  GoogleApiClient.ConnectionCallbacks,
  GoogleApiClient.OnConnectionFailedListener {

 private static final String TAG = "BaseDriveActivity";

 /**
  * DriveId of an existing folder to be used as a parent folder in folder
  * operations samples.
  */
 public static final String EXISTING_FOLDER_ID = "0B2EEtIjPUdX6MERsWlYxN3J6RU0";

 /**
  * DriveId of an existing file to be used in file operation samples..
  */
 public static String EXISTING_FILE_ID = "0ByfSjdPVs9MZTHBmMVdSeWxaNTg";

 /**
  * Extra for account name.
  */
 protected static final String EXTRA_ACCOUNT_NAME = "account_name";

 /**
  * Request code for auto Google Play Services error resolution.
  */
 protected static final int REQUEST_CODE_RESOLUTION = 1;

 /**
  * Next available request code.
  */
 protected static final int NEXT_AVAILABLE_REQUEST_CODE = 2;

 /**
  * Google API client.
  */
 private GoogleApiClient mGoogleApiClient;

 /**
  * Called when activity gets visible. A connection to Drive services need to
  * be initiated as soon as the activity is visible. Registers
  * {@code ConnectionCallbacks} and {@code OnConnectionFailedListener} on the
  * activities itself.
  */
 @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();
 }

 /**
  * Handles resolution callbacks.
  */
 @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();
  }
 }

 /**
  * Called when activity gets invisible. Connection to Drive service needs to
  * be disconnected as soon as an activity is invisible.
  */
 @Override
 protected void onPause() {
  if (mGoogleApiClient != null) {
   mGoogleApiClient.disconnect();
  }
  super.onPause();
 }

 /**
  * Called when {@code mGoogleApiClient} is connected.
  */
 @Override
 public void onConnected(Bundle connectionHint) {
  Log.i(TAG, "GoogleApiClient connected");
 }

 /**
  * Called when {@code mGoogleApiClient} is disconnected.
  */
 @Override
 public void onConnectionSuspended(int cause) {
  Log.i(TAG, "GoogleApiClient connection suspended");
 }

 /**
  * Called when {@code mGoogleApiClient} is trying to connect but failed.
  * Handle {@code result.getResolution()} if there is a resolution is
  * available.
  */
 @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 (SendIntentException e) {
   Log.e(TAG, "Exception while starting resolution activity", e);
  }
 }

 /**
  * Shows a toast message.
  */
 public void showMessage(String message) {
  Toast.makeText(this, message, Toast.LENGTH_LONG).show();
 }

 /**
  * Getter for the {@code GoogleApiClient}.
  */
 public GoogleApiClient getGoogleApiClient() {
  return mGoogleApiClient;
 }
}

我想在PickFileWithOpenerActivity中获取文件路径目前我在onActivityResult中使用DriveId获取所选文件ID请有人帮助我并告诉我如何从驱动器获取文件路径并将文件下载到设备。

1 个答案:

答案 0 :(得分:3)

@ Santosh目前您正在使用不会返回的驱动器ID选择的文件名我在下面分享我的代码请使用此类而不是PickFileWithOpenerActivity

   /**
 * Copyright 2014 Google Inc. All Rights Reserved.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing permissions and
 * limitations under the License.
 */



import android.content.Intent;
import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.drive.Drive;
import com.google.android.gms.drive.DriveFile;
import com.google.android.gms.drive.DriveId;
import com.google.android.gms.drive.DriveResource.MetadataResult;
import com.google.android.gms.drive.MetadataChangeSet;
import com.google.android.gms.drive.OpenFileActivityBuilder;

/**
 * An activity that pins a file to the device. Pinning allows a file's latest
 * version to be available locally all the time. Your users should be informed
 * about the extra bandwidth and storage requirements of pinning.
 */
public class PinFileActivity extends BaseDemoActivity {

    private static final int REQUEST_CODE_OPENER = NEXT_AVAILABLE_REQUEST_CODE;

    private static final String TAG = "PinFileActivity";

    private DriveId mFileId;

    /**
     * Starts a file opener intent to pick a file.
     */
    @Override
    public void onConnected(Bundle connectionHint) {
        super.onConnected(connectionHint);
        if (mFileId == null) {
            IntentSender intentSender = Drive.DriveApi
                    .newOpenFileActivityBuilder()
                    .setMimeType(
                            new String[] { "text/plain", "text/html",
                                    "application/pdf", "audio/mp3",
                                    "video/mp4", "text/plain",
                                    "application/msword", "image/jpeg",
                                    "image/png", "text/html" })
                    .build(getGoogleApiClient());
            try {
                startIntentSenderForResult(intentSender, REQUEST_CODE_OPENER,
                        null, 0, 0, 0);
            } catch (SendIntentException e) {
                Log.w(TAG, "Unable to send intent", e);
            }
        } else {
            DriveFile file = Drive.DriveApi.getFile(getGoogleApiClient(),
                    mFileId);
            Log.i("File Name is ", "===========>>>>" + file);
            file.getMetadata(getGoogleApiClient()).setResultCallback(
                    metadataCallback);
        }
    }

    /**
     * Handles response from the file picker.
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
        case REQUEST_CODE_OPENER:
            if (resultCode == RESULT_OK) {
                mFileId = (DriveId) data
                        .getParcelableExtra(OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);

            } else {
                finish();
            }
            break;
        default:
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

    /**
     * Handles the metadata response. If file is pinnable and not already
     * pinned, makes a request to pin the file.
     */
    final ResultCallback<MetadataResult> metadataCallback = new ResultCallback<MetadataResult>() {
        @Override
        public void onResult(MetadataResult result) {
            if (!result.getStatus().isSuccess()) {
                showMessage("Problem while trying to retrieve the file metadata");
                return;
            }
            if (result.getMetadata().isPinnable()) {
                showMessage("File is not pinnable");
                Log.i("==========All Info is here", "mIME tYPE=====>>>"
                        + result.getMetadata().getMimeType() + "======>"
                        + result.getMetadata().getTitle() + "====="

                        + result.getMetadata().getAlternateLink() + "======"

                        + result.getMetadata().getWebContentLink() + "======>>"
                        + result.getMetadata().getQuotaBytesUsed());
                return;
            }
            if (result.getMetadata().isPinned()) {
                showMessage("File is already pinned");
                return;
            }

            Log.i("==========All Info is here", "==========>>>");

            DriveFile file = Drive.DriveApi.getFile(getGoogleApiClient(),
                    mFileId);
            MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
                    .setPinned(true).build();
            file.updateMetadata(getGoogleApiClient(), changeSet)
                    .setResultCallback(pinningCallback);

        }
    };

    /**
     * Handles the pinning request's response.
     */
    final ResultCallback<MetadataResult> pinningCallback = new ResultCallback<MetadataResult>() {
        @Override
        public void onResult(MetadataResult result) {
            if (!result.getStatus().isSuccess()) {
                showMessage("Problem while trying to pin the file");
                return;
            }
            showMessage("File successfully pinned to the device");
        }
    };
}

我已经将一些登录结果回调,显示选中的文件和路径

谢谢