2014-11-20 4 views
1

다음 프로그램은 Google 드라이브에서 '나와 공유 한 파일'을 표시합니다. listView에있는 모든 파일을 표시하고 있습니다. 여기에서 사용자가 목록 항목을 클릭 할 때마다 Google 드라이브 파일을 다운로드하고 파일의 드라이브 ID를 얻기 위해 코드를 작성했습니다.android api를 사용하여 Google 드라이브 파일을 다운로드하는 방법

다음 코드에서 수행 한 작업입니다.

Google 드라이브 android API를 사용하여 사용자가 목록 항목을 클릭 할 때마다 Google 드라이브에서 파일을 다운로드하도록 도와주세요.

가) 대해서 getFile를 호출하여 DriveFile 객체를 생성 :

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

}

답변

0

파일을 직접 다운로드 할 수있는 API의 특정 방법이 없기 때문에, 이러한 목표를 달성하기위한 해결 방법에는 두 가지가 있습니다() 메소드를 호출합니다. 그런 다음 java.io.InputStream 라이브러리를 사용하여 파일을 열고이 스트림을 로컬 파일로 변환하십시오. 이 리소스에 대한 추가 정보 : https://developers.google.com/drive/android/files

b) 메타 데이터 WebContentLink를 사용하면 브라우저의 의도 또는 WebView를 통해 해당 URL에 액세스 할 수 있습니다. 다시 인증해야 할 수도 있습니다. 브라우저에서 파일을 열면 다운로드 요청이 표시됩니다. RetrieveContentsActivity 코드가 어떻게 InputStreamReader에 파일 내용을 얻을하는 방법을 보여줍니다

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

:

+0

https://developers.google.com/drive/android/files 당신에게 리베로 감사드립니다. Google 드라이브 서비스를 사용하려면 Gmail 계정을 통해 로그인해야합니다. WebContentLink를 브라우저에 전달하면 인증을 요청해야하지만 이미 응용 프로그램에서 내 계정을 인증했습니다. 내 응용 프로그램에서 브라우저에 인증을 설정할 수있는 방법이 있습니까? – Manoj

0

은에서 구글 드라이브 안드로이드 API 샘플을 살펴보십시오.

은 Google 드라이브 API를 사용

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

에 새 응용 프로그램을 등록해야합니다 샘플을 실행합니다.

이 API를 사용하려면 Google 콘솔에서 Credentials/OAuth에 새 클라이언트 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 

상세 정보 :

관련 문제