2015-08-28 72 views
1

我想上傳我的數據庫,我在我的應用程序中創建的驅動器api,到用戶驅動器。我現在寫了一些代碼,並在互聯網上搜索我如何上傳數據庫。當我現在測試它時,總是會說GoogleApi已連接並正在上載數據庫,但當我沒有連接到互聯網時,我不知道如何。驅動器API每次連接,仍然沒有互聯網

這裏是我的代碼:

public class Activity_Main extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

private static GoogleApiClient api; 
private static final String DATABASE_NAME = utilsDB.DATABASE_NAME; 
private static final String GOOGLE_DRIVE_FILE_NAME = db_backup; 

private boolean mResolvingError = false; 
private DriveFile mfile; 
private static final int DIALOG_ERROR_CODE =100; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    api = new GoogleApiClient.Builder(this) 
      .addApi(Drive.API) 
      .addScope(Drive.SCOPE_FILE) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 
    ... 
} 

@Override 
public void onConnectionFailed(ConnectionResult result) { 
    mToast(Connection failed...); 
    if(mResolvingError) { 
     return; 
    } else if(result.hasResolution()) { 
     mResolvingError = true; 
     try { 
      result.startResolutionForResult(this, DIALOG_ERROR_CODE); 
     } catch (IntentSender.SendIntentException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     ErrorDialogFragment fragment = new ErrorDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(error, result.getErrorCode()); 
     fragment.setArguments(args); 
     fragment.show(getFragmentManager(), errordialog); 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    mToast(onActivityResult); 
    if(requestCode == DIALOG_ERROR_CODE) { 
     mResolvingError = false; 
     if(resultCode == RESULT_OK) { 
      if(!api.isConnecting() && !api.isConnected()) { 
       api.connect(); 
      } 
     } 
    } 
} 

@Override 
public void onConnected(Bundle connectionHint) { 
    mToast(Connected successfully); 

    Drive.DriveApi.newDriveContents(api).setResultCallback(contentsCallback); 
} 

final private ResultCallbackDriveApi.DriveContentsResult contentsCallback = new ResultCallbackDriveApi.DriveContentsResult() { 

    @Override 
    public void onResult(DriveApi.DriveContentsResult result) { 
     if (!result.getStatus().isSuccess()) { 
      debug(Error while trying to create new file contents); 
      return; 
     } 

     String mimeType = MimeTypeMap.getSingleton().getExtensionFromMimeType(db); 
     MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
       .setTitle(GOOGLE_DRIVE_FILE_NAME) Google Drive File name 
       .setMimeType(mimeType) 
       .setStarred(true).build(); 
     create a file on root folder 
     Drive.DriveApi.getRootFolder(api) 
       .createFile(api, changeSet, result.getDriveContents()) 
       .setResultCallback(fileCallback); 
    } 

}; 

final private ResultCallbackDriveFolder.DriveFileResult fileCallback = new ResultCallbackDriveFolder.DriveFileResult() { 

    @Override 
    public void onResult(DriveFolder.DriveFileResult result) { 
     if (!result.getStatus().isSuccess()) { 
      mToast(Error while trying to create the file); 
      return; 
     } 
     mfile = result.getDriveFile(); 
     mfile.open(api, DriveFile.MODE_WRITE_ONLY, null).setResultCallback(contentsOpenedCallback); 
    } 
}; 

final private ResultCallbackDriveApi.DriveContentsResult contentsOpenedCallback = new ResultCallbackDriveApi.DriveContentsResult() { 

    @Override 
    public void onResult(DriveApi.DriveContentsResult result) { 

     if (!result.getStatus().isSuccess()) { 
      mToast(Error opening file); 
      return; 
     } 

     try { 
      mToast(Uploading db...); 
      FileInputStream is = new FileInputStream(getDbPath()); 
      BufferedInputStream in = new BufferedInputStream(is); 
      byte[] buffer = new byte[8 1024]; 
      DriveContents content = result.getDriveContents(); 
      BufferedOutputStream out = new BufferedOutputStream(content.getOutputStream()); 
      int n = 0; 
      while((n = in.read(buffer)) 0) { 
       out.write(buffer, 0, n); 
      } 

      in.close(); 
      mToast(Upload successfull!); 
      api.disconnect(); 


     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

}; 

private File getDbPath() { 
    return getDatabasePath(DATABASE_NAME); 
} 

@Override 
public void onConnectionSuspended(int cause) { 
    debug(Connection suspended); 

} 

public void onDialogDismissed() { 
    mResolvingError = false; 
} 

public static class ErrorDialogFragment extends DialogFragment { 
    public ErrorDialogFragment() {} 

    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     int errorCode = this.getArguments().getInt(error); 
     return GooglePlayServicesUtil.getErrorDialog(errorCode, this.getActivity(), DIALOG_ERROR_CODE); 
    } 

    public void onDismiss(DialogInterface dialog) { 
     dialog.dismiss(); 
    } 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.sync 
      mToast(Connecting to Drive API ...); 
      api.connect(); 
      return true; 
     } 
} 

回答

2

連接意味着你連接到GooPlaySvcs的GDAA服務,而不是互聯網。請仔細閱讀GDAA文檔(請參閱架構),您會發現整體觀點是,GDAA嘗試屏蔽您的應用程序與網絡在線/離線狀態(儘可能)。

只要有網絡連接,您的本地狀態就會同步。此外,即使您的wifi已連接,也不表示您的GDAA請求會立即得到滿足,GDAA將根據其內部邏輯優化網絡流量。

您可以輕鬆放棄這些優勢,並通過切換到REST Api來獲得完全控制權,但您必須自己處理在線/離線狀態,請求結果......。無論如何,可能最終會使用同步適配器。亂。

好運

0

ConnectionResult resultApi = getGoogleApiClient().blockingConnect(); 嘗試將等到GoogleApi連接,從而將在AsyncTask

此外,您還可以使用await()方法,而不是setResultCallback(),請找到實例:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == DIALOG_ERROR_CODE && resultCode == RESULT_OK) { 

      final DriveId folderId = (DriveId) data.getParcelableExtra(OpenFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); 
      AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>(){ 

       int intReturnType = 0; 
       @Override 
       protected void onPostExecute(Void result) { 
        //Do Logic... 
       } 

       @Override 
       protected Void doInBackground(Void... params) { 

        ConnectionResult resultApi = getGoogleApiClient().blockingConnect(); 
        if (!resultApi.isSuccess()) { 
         return null; 
        } 

        DriveFolder folder = Drive.DriveApi.getFolder(getGoogleApiClient(), folderId); 
        DriveResource.MetadataResult result = folder.getMetadata(getGoogleApiClient()).await(); 
        if (!result.getStatus().isSuccess()) { 
         Log.d("Folder", "Problem while trying to fetch metadata."); 
         return null; 
        } 

        Log.d("FolderName", metadata.getTitle()); 
        return null; 
       } 
      }; 
      task.execute(); 
     } 
}