首页 > 解决方案 > 带有 Google api 密钥的 GoogleAccountCredential

问题描述

我正在使用谷歌表格 API,我正在使用表格 API 创建新的谷歌表格,但这是使用启用表格 API 的帐户,如果我将我的应用程序提供给另一个用户,他无法使用他的 Gmail 创建新表格. 我有 API 密钥,是否可以在不选择 Gmail 帐户的情况下创建工作表

GoogleAccountCredential mCredential;
private static final String BUTTON_TEXT = "Call Google Sheets API";
private static final String PREF_ACCOUNT_NAME = "accountName";
private static final String[] SCOPES = {SheetsScopes.SPREADSHEETS};

mCredential = GoogleAccountCredential.usingOAuth2(
                  getApplicationContext(), Arrays.asList(SCOPES))
                  .setBackOff(new ExponentialBackOff());

private void getResultsFromApi() {
      Log.d(TAG, "getResultsFromApi: ");
      if (!isGooglePlayServicesAvailable()) {
          Log.d(TAG, "getResultsFromApi: 1");
          acquireGooglePlayServices();
      } else if (mCredential.getSelectedAccountName() == null) {
          Log.d(TAG, "getResultsFromApi: 2");
          chooseAccount();
      } else if (!isDeviceOnline()) {
          Log.d(TAG, "getResultsFromApi: No network connection available.");
      } else {
          // x();
          try {
              new MakeRequestTask(mCredential).execute();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }

  private boolean isDeviceOnline() {
      ConnectivityManager connMgr =
              (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
      NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
      return (networkInfo != null && networkInfo.isConnected());
  }

@AfterPermissionGranted(REQUEST_PERMISSION_GET_ACCOUNTS)
  private void chooseAccount() {
      if (EasyPermissions.hasPermissions(
              this, Manifest.permission.GET_ACCOUNTS)) {
          String accountName = getPreferences(Context.MODE_PRIVATE)
                  .getString(PREF_ACCOUNT_NAME, null);
          if (accountName != null) {
              Log.d(TAG, "chooseAccount: 1");
              mCredential.setSelectedAccountName(accountName);
              getResultsFromApi();
          } else {
              Log.d(TAG, "chooseAccount: 2");
              // Start a dialog from which the user can choose an account
              startActivityForResult(
                      mCredential.newChooseAccountIntent(),
                      REQUEST_ACCOUNT_PICKER);
          }
      } else {
          // Request the GET_ACCOUNTS permission via a user dialog
          EasyPermissions.requestPermissions(
                  this,
                  "This app needs to access your Google account (via Contacts).",
                  REQUEST_PERMISSION_GET_ACCOUNTS,
                  Manifest.permission.GET_ACCOUNTS);
      }
  }

private class MakeRequestTask extends AsyncTask<Void, Void, List<String>> {
      private com.google.api.services.sheets.v4.Sheets mService = null;
      private Exception mLastError = null;

      public MakeRequestTask(GoogleAccountCredential credential) throws IOException {
          HttpTransport transport = AndroidHttp.newCompatibleTransport();
          JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
          mService = new com.google.api.services.sheets.v4.Sheets.Builder(
                  transport, jsonFactory, credential)
                  .setApplicationName("Google Sheets API Android Quickstart")
                  .build();

          new Thread() {
              @Override
              public void run() {
                  try {

                      if (consurEtSurname.getText().toString().isEmpty()) {
                          consurEtSurname.setError("Please provide survey name!");
                          consurEtSurname.requestFocus();
                      } else {

                          Spreadsheet spreadsheet = new Spreadsheet()
                                  .setProperties(new SpreadsheetProperties()
                                          .setTitle(consurEtSurname.getText().toString()));


                          spreadsheet = mService.spreadsheets().create(spreadsheet)
                                  .setFields("spreadsheetId")
                                  .execute();

                          Makecolums(mService,spreadsheet.getSpreadsheetId());
                          upload(spreadsheet.getSpreadsheetId());
                          Log.d(TAG, "onCreate: " + spreadsheet.getSpreadsheetId());
                          Log.d(TAG, "run: " + spreadsheet.getSpreadsheetUrl());
                      }

                 //     writeToSheetUsingApi(mService,spreadsheet.getSpreadsheetId());

                  } catch (IOException e) {
                      e.printStackTrace();
                  } catch (GeneralSecurityException e) {
                      e.printStackTrace();
                  }
//                    catch (GeneralSecurityException e) {
//                        e.printStackTrace();
//                    }


              }
          }.start();


      }

//
//        @Override
//        protected List<String> doInBackground(Void... params) {
//            try {
//                return getDataFromApi();
//            } catch (Exception e) {
//                mLastError = e;
//                cancel(true);
//                return null;
//            }
//        }
//
//
//        private List<String> getDataFromApi() throws IOException {
//            String spreadsheetId = "196tcE1k5RuqTdGSBDpTFAI5h3m_dwXR875Q3csmi4ko";
//            String range = "A1:X1";
//
//            List<String> results = new ArrayList<String>();
//            ValueRange response = this.mService.spreadsheets().values()
//                    .get(spreadsheetId, range)
//                    .execute();
//
//            List<List<Object>> values = response.getValues();
//            if (values != null) {
//                for (int i = 0; i < values.size(); i++) {
//                    results.add(values.get(i).get(0) + ", " + values.get(i).get(1));
//                }
//            }
//            return results;
//        }


      @Override
      protected List<String> doInBackground(Void... voids) {
          return null;
      }

      @Override
      protected void onPreExecute() {
          //mOutputText.setText("");
          mProgress.show();
      }

      @Override
      protected void onPostExecute(List<String> output) {
          mProgress.hide();
          if (output == null || output.size() == 0) {
              Log.d(TAG, "\"No results returned.\": ");
          } else {
              output.add(0, "Data retrieved using the Google Sheets API:");
              Log.d(TAG, TextUtils.join("\n", output));
              Log.d("TagOutputPost", TextUtils.join("\n", output));
          }
      }

      @Override
      protected void onCancelled() {
          mProgress.hide();
          if (mLastError != null) {
              if (mLastError instanceof GooglePlayServicesAvailabilityIOException) {
                  showGooglePlayServicesAvailabilityErrorDialog(
                          ((GooglePlayServicesAvailabilityIOException) mLastError)
                                  .getConnectionStatusCode());
              } else if (mLastError instanceof UserRecoverableAuthIOException) {
                  startActivityForResult(
                          ((UserRecoverableAuthIOException) mLastError).getIntent(),
                          REQUEST_AUTHORIZATION);
              } else {
                  Log.d(TAG, "The following error occurred:\n"
                          + mLastError.getMessage());

              }
          } else {
              Log.d(TAG, "Request onCancelled: ");
          }
      }
  }


  @Override
  protected void onActivityResult(
          int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      switch (requestCode) {
          case REQUEST_GOOGLE_PLAY_SERVICES:
              if (resultCode != RESULT_OK) {
                  Log.d(TAG,  "This app requires Google Play Services. Please install " +
                          "Google Play Services on your device and relaunch this app.");

              } else {
                  getResultsFromApi();
              }
              break;
          case REQUEST_ACCOUNT_PICKER:
              if (resultCode == RESULT_OK && data != null &&
                      data.getExtras() != null) {
                  String accountName =
                          data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                  if (accountName != null) {
                      SharedPreferences settings =
                              getPreferences(Context.MODE_PRIVATE);
                      SharedPreferences.Editor editor = settings.edit();
                      editor.putString(PREF_ACCOUNT_NAME, accountName);
                      editor.apply();
                      mCredential.setSelectedAccountName(accountName);
                      getResultsFromApi();
                  }
              }
              break;
          case REQUEST_AUTHORIZATION:
              if (resultCode == RESULT_OK) {
                  getResultsFromApi();
              }
              break;
      }
  }

  private boolean isGooglePlayServicesAvailable() {
      GoogleApiAvailability apiAvailability =
              GoogleApiAvailability.getInstance();
      final int connectionStatusCode =
              apiAvailability.isGooglePlayServicesAvailable(this);
      return connectionStatusCode == ConnectionResult.SUCCESS;
  }

  private void acquireGooglePlayServices() {
      GoogleApiAvailability apiAvailability =
              GoogleApiAvailability.getInstance();
      final int connectionStatusCode =
              apiAvailability.isGooglePlayServicesAvailable(this);
      if (apiAvailability.isUserResolvableError(connectionStatusCode)) {
          showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
      }
  }

  void showGooglePlayServicesAvailabilityErrorDialog(
          final int connectionStatusCode) {
      GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
      Dialog dialog = apiAvailability.getErrorDialog(
              ConfirmSurvey.this,
              connectionStatusCode,
              REQUEST_GOOGLE_PLAY_SERVICES);
      dialog.show();
  }

  @Override
  public void onPermissionsGranted(int requestCode, List<String> perms) {

  }

  @Override
  public void onPermissionsDenied(int requestCode, List<String> perms) {

  }

标签: javaandroidgoogle-apigoogle-sheets-api

解决方案


推荐阅读