2016-08-03 254 views
1

我成功地集成了谷歌驅動器在我的Android應用程序。但無法下載選定的圖像文件。 這是我的代碼。存在問題結果回調方法從不執行。請幫助我。並且我還用data.getData()方法onActivity結果只有這個方法返回null。我如何找到圖像的URI?從谷歌驅動器Android API下載圖片?

package com.example.syedfurqan.dropboxintegration; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.IntentSender; 
import android.content.IntentSender.SendIntentException; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.dropbox.chooser.android.DbxChooser; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GoogleApiAvailability; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.PendingResult; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.drive.Drive; 
import com.google.android.gms.drive.DriveApi; 
import com.google.android.gms.drive.DriveContents; 
import com.google.android.gms.drive.DriveFile; 
import com.google.android.gms.drive.DriveId; 
import com.google.android.gms.drive.DriveResource; 
import com.google.android.gms.drive.Metadata; 
import com.google.android.gms.drive.OpenFileActivityBuilder; 

import java.io.InputStream; 



public class BaseDemoActivity extends Activity implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    private static final String TAG = "BaseDriveActivity"; 

    protected static final int REQUEST_CODE_RESOLUTION = 1; 

    private static final int REQ_CODE_OPEN = 2; 


    private GoogleApiClient mGoogleApiClient; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // setContentView(R.layout.activity_base_demo); 
     if (mGoogleApiClient == null) { 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addApi(Drive.API) 
        .addScope(Drive.SCOPE_FILE) 
        .addScope(Drive.SCOPE_APPFOLDER) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .build(); 
     } 
     mGoogleApiClient.connect(); 
    } 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 
     switch (requestCode) { 
      case REQ_CODE_OPEN: 
       if (resultCode == RESULT_OK) { 
        DriveId mFileId = (DriveId) data 
          .getParcelableExtra(OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); 
        DriveFile selectedFile = mFileId.asDriveFile(); 


        selectedFile.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY, null) 
          .setResultCallback(idCallback); 

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

    @Override 
    protected void onPause() { 
     if (mGoogleApiClient != null) { 
      mGoogleApiClient.disconnect(); 
     } 
     super.onPause(); 
    } 


//Picker 
    @Override 
    public void onConnected(Bundle connectionHint) { 
     Log.i(TAG, "GoogleApiClient connected"); 
     // Launch user interface and allow user to select file 
     try { 
      IntentSender i = Drive.DriveApi 
        .newOpenFileActivityBuilder() 
        .setMimeType(new String[]{"image/png", "image/jpeg"}) 
        .build(mGoogleApiClient); 
      startIntentSenderForResult(i, REQ_CODE_OPEN, null, 0, 0, 0); 
     } catch (Exception e) { 
     } 
    } 

    final private ResultCallback<DriveApi.DriveContentsResult> idCallback = new ResultCallback<DriveApi.DriveContentsResult>() { 
     @Override 
     public void onResult(DriveApi.DriveContentsResult result) { 
      if (!result.getStatus().isSuccess()) { 
       // Handle an error 
      } 
      DriveContents driveContents = result.getDriveContents(); 
      InputStream is = driveContents.getInputStream(); 
      Bitmap bitmap = BitmapFactory.decodeStream(is); 
      Values.setBitmap(bitmap); 

     } 
    }; 



    @Override 
    public void onConnectionSuspended(int cause) { 
     Log.i(TAG, "GoogleApiClient connection suspended"); 
    } 


    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     Log.i(TAG, "GoogleApiClient connection failed: " + result.toString()); 
     if (!result.hasResolution()) { 
      // show the localized error dialog. 
      GoogleApiAvailability.getInstance().getErrorDialog(this, result.getErrorCode(), 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; 
    } 


} 
+0

我找到了解決辦法,現在.. :) – Furqan

回答

3

我剛剛使用Android Google Drive默認API類來完成我的任務。這裏是代碼:

// BaseDemoActivity

package com.example.syedfurqan.dropboxintegration; 

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; 

public abstract class BaseDemoActivity extends Activity implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    private static final String TAG = "BaseDriveActivity"; 
    protected static final int REQUEST_CODE_RESOLUTION = 1; 


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

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

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

//檢索內容

package com.example.syedfurqan.dropboxintegration; 


import android.content.Intent; 
import android.content.IntentSender; 
import android.content.IntentSender.SendIntentException; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ProgressBar; 

import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.drive.Drive; 
import com.google.android.gms.drive.DriveApi.DriveContentsResult; 
import com.google.android.gms.drive.DriveContents; 
import com.google.android.gms.drive.DriveFile; 
import com.google.android.gms.drive.DriveFile.DownloadProgressListener; 
import com.google.android.gms.drive.DriveId; 
import com.google.android.gms.drive.OpenFileActivityBuilder; 

import java.io.InputStream; 

/** 
* An activity to illustrate how to open contents and listen 
* the download progress if the file is not already sync'ed. 
*/ 
public class RetreiveContent extends BaseDemoActivity { 

    private static final String TAG = "RetrieveFileWithProgressDialogActivity"; 

    /** 
    * Request code to handle the result from file opening activity. 
    */ 
    private static final int REQUEST_CODE_OPENER = 1; 

    /** 
    * Progress bar to show the current download progress of the file. 
    */ 
    private ProgressBar mProgressBar; 

    /** 
    * File that is selected with the open file activity. 
    */ 
    private DriveId mSelectedFileDriveId; 

    @Override 
    protected void onCreate(Bundle b) { 
     super.onCreate(b); 
     setContentView(R.layout.activity_progress); 
     mProgressBar = (ProgressBar) findViewById(R.id.progressBar); 
     mProgressBar.setMax(100); 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
     super.onConnected(connectionHint); 

     // If there is a selected file, open its contents. 
     if (mSelectedFileDriveId != null) { 
      open(); 
      return; 
     } 

     // Let the user pick an mp4 or a jpeg file if there are 
     // no files selected by the user. 
     IntentSender intentSender = Drive.DriveApi 
       .newOpenFileActivityBuilder() 
       .setMimeType(new String[]{"video/mp4", "image/png", "image/jpeg"}) 
       .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) { 
     if (requestCode == REQUEST_CODE_OPENER && resultCode == RESULT_OK) { 
      mSelectedFileDriveId = (DriveId) data.getParcelableExtra(
        OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); 

//   open(); 
     } else { 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
    } 

    private void open() { 
     // 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_ONLY, 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; 
        } 
        DriveContents driveContents = result.getDriveContents(); 
        InputStream is = driveContents.getInputStream(); 
        Bitmap bitmap = BitmapFactory.decodeStream(is); 
        Values.setBitmap(bitmap); 
        //showMessage("File contents opened"); 
        RetreiveContent.this.finish(); 

       } 
      }; 
} 
+2

如此之大!謝謝。 – sonnv1368