0

I'm using google sheets API with which I am creating new google sheets using sheets API, But this is using the account in which the sheet's API is enabled, If I give my app to another user he cannot create a new sheet using his Gmail. I have the API key, Is it possible to create sheets without selecting Gmail accounts

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) {

  }
  • What do you mean by `Is it possible to create sheets without selecting Gmail accounts`? – Rafa Guillermo Aug 12 '20 at 10:00
  • Like I already have the API key from my google cloud console...so I want users to be able to create a new sheet when needed but all the users should have the same auth...like using an API key to do the auth and create sheets, Bec that API key is linked to my cloud console and my Gmail..sorry if I don't make sense I have no idea about auths... Basically I'll be giving this app to many ppl but I want the sheets to be created using only my account or API – Gnana Sreekar Aug 12 '20 at 17:25
  • It might be useful to read up a bit on OAuth which you can do [here](https://stackoverflow.com/a/61654179/11551468). I think your best bet here is to use a service account as this way you don't have to worry about reauthentication – Rafa Guillermo Aug 13 '20 at 07:53

0 Answers0