2014-10-09 55 views
2

我已經成功地將GoogleDrive集成到了我的Android應用程序中,現在我可以上傳任何文件以從應用程序中驅動。但我想從驅動器下載文件到設備此我使用下面給出一些代碼 -如何在Android集成中從GoogleDrive獲取選定的文件路徑?

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請別人幫助我,告訴我如何獲取文件路徑並將文件從雲端硬盤下載到設備。

回答

3

@桑托斯目前正在使用的將不返回選定的文件名下面我列舉我的代碼驅動器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"); 
     } 
    }; 
} 

我已經把一些登錄結果回電其中顯示選中的文件和路徑

謝謝

+0

謝謝。這個對我有用。 – 2014-10-09 09:27:47

+0

所有文件打開,但有些文件不能被選擇文件類型是Unknown的請求幫助 – 2016-11-22 06:44:36

相關問題