2014-11-20 3 views
1

Следующая программа отобразит «общие файлы с вами» с Google Drive. Я показываю все файлы в listView, здесь я хочу загрузить файл диска google всякий раз, когда пользователь щелкает элемент списка, и я написал код для получения идентификатора диска.Как загрузить файлы с диска Google с помощью android api

Это то, что я сделал в следующем коде.

Пожалуйста, помогите мне загрузить файл с Google Drive всякий раз, когда пользователь щелкает элемент списка с помощью Google Android android api.

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 для непосредственной загрузки файла, есть два пути, чтобы сделать это:

а) Создание объекта DriveFile путем вызова GetFile(). Затем, открыв файл с помощью библиотеки java.io.InputStream и преобразуя этот поток в локальный файл. Дополнительная информация об этом ресурсе: https://developers.google.com/drive/android/files

b) С метаданными WebContentLink обращайтесь к этому URL-адресу либо с помощью намерения в вашем браузере, либо через WebView. Возможно, вам потребуется повторная аутентификация. Открытие файла в браузере должно запрашивать запрос на загрузку.

+0

Спасибо Риверо. Чтобы использовать службы Google Drive, я должен войти в систему через мою учетную запись gmail. Если я передаю WebContentLink в браузер, он должен попросить меня об аутентификации, но я уже аутентифицировал свою учетную запись в приложении. Есть ли способ установить аутентификацию в браузере из моего приложения? – Manoj

0

Посмотрите на образец Google Drive Android API в:

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

Код RetrieveContentsActivity показывает вам, как получить содержимое файла в InputStreamReader.

Для запуска образца вам придется зарегистрировать новое приложение в

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

Включить API Google Drive.

Чтобы использовать этот API, вам нужно будет создать новый идентификатор клиента в Credentials/OAuth (в Google Консоле).

Вам нужно будет сгенерировать ключ SHA1 с помощью keytool и вставить его там.

пример для Windows:

C:\Program Files\Java\jre1.8.0_40\bin>keytool -exportcert -alias androiddebugkey 
-keystore C:\Users\yourusername\.android\debug.keystore -list -v 

Больше информации здесь: https://developers.google.com/drive/android/files

Смежные вопросы