2016-07-08 2 views
0

Android 앱을 개발 중입니다. 사용자가 Google 계정으로 로그인하면 Google 시트에 액세스하여 데이터베이스를 가져 오는 기능이 있습니다. Google Spreadsheet Api를 검색하려고했지만 사용법이 명확하지 않았습니다.사용자가 Google 계정으로 로그인 한 후 비공개 Google 시트에서 데이터를 가져 오는 방법은 무엇입니까?

물론 아래 코드에서 공개 시트의 데이터를 가져올 수 있지만 문제는 개인 시트를 얻는 것입니다.

private List<String> getDataFromApi() throws IOException { 
      String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms"; 
      String range = "Class Data!A2:E"; 
      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) { 
       results.add("Name, Major"); 
       for (List row : values) { 
        results.add(row.get(0) + ", " + row.get(4)); 
       } 
      } 


      return results; 
     } 

또한 어딘가에 검색하여 아래의 코드를 발견하지만 NoSuchMethodError 예외가 발생, 나는 라인 spreadsheet.setUserCredentials에서 "사용자 이름"과 "암호"무엇 혼동.

SpreadsheetService spreadsheet= new SpreadsheetService("v1"); 
    spreadsheet.setProtocolVersion(SpreadsheetService.Versions.V3); 

    try { 
     spreadsheet.setUserCredentials("username", "password"); 
     URL metafeedUrl = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full"); 
     SpreadsheetFeed feed = spreadsheet.getFeed(metafeedUrl, SpreadsheetFeed.class); 

     List<SpreadsheetEntry> spreadsheets = feed.getEntries(); 
     for (SpreadsheetEntry service : spreadsheets) {    
      System.out.println(service.getTitle().getPlainText()); 
     } 
    } catch (AuthenticationException e) {   
     e.printStackTrace(); 
    } 

누구든지이 작업을 수행하거나 샘플 코드를 갖고있는 방법을 알고 있습니다. 미리 감사드립니다!

답변

2

마지막으로, 나는 내 질문에 대한 해결책을 찾았으며 이제는 그것을 극복하기 위해 다른 사람들이 같은 문제에 직면하도록 돕기 위해 게시하고 있습니다.

  • 는 첫째로 모두의, https://console.developers.google.com으로 이동하여 프로젝트와 관련된 새로운 OAuth 클라이언트 ID 자격 증명을 만들 수 있습니다.

    당신의 안드로이드 프로젝트에 지금
  • , 의존성이 라이브러리를 추가의 AndroidManifest.xml에서

    dependencies {  
        compile 'com.google.android.gms:play-services-auth:9.2.1'  
        compile files('libs/gdata-client-1.0.jar')  
        compile files('libs/gdata-client-meta-1.0.jar')  
        compile files('libs/gdata-core-1.0.jar')  
        compile files('libs/gdata-core-1.0-sources.jar')  
        compile files('libs/gdata-spreadsheet-3.0.jar')  
        compile files('libs/gdata-spreadsheet-meta-3.0.jar')  
        compile files('libs/guava-10.0.1.jar')  
        compile files('libs/jsr305-1.3.9.jar')  
    }
  • 이 권한을 추가 :
    이-사용 권한 안드로이드 : 이름 = "android.permission.INTERNET은"
    을 사용 - 권한 안드로이드 : 이름 = "android.permission.GET_ACCOUNTS"

  • 또한 <application></application> 태그에 이것을 추가 :

    ,451,515,

    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

  • 그리고 코드는 다음과 같다 :

    public class DownloadDatabaseActivity extends AppCompatActivity { 
    
        private static final String TAG = "my_log"; 
        public static ProgressDialog mProgressDialog; 
        String spreadsheetName; 
        String worksheetName; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_download_database); 
    
         Button btnDownload = (Button) findViewById(R.id.btnDownload); 
         btnDownload.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           EditText etSpreadsheetName = (EditText) findViewById(R.id.etSpreadsheetName); 
           EditText etWorksheetName = (EditText) findViewById(R.id.etWorksheetName); 
           spreadsheetName = etSpreadsheetName.getText().toString(); 
           worksheetName = etWorksheetName.getText().toString(); 
    
           Intent intent = AccountPicker.newChooseAccountIntent(null, null, 
             new String[]{"com.google"}, false, null, null, null, null); 
           startActivityForResult(intent, 1); 
          } 
         }); 
        } 
    
        @Override 
        protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
         if (requestCode == 1 && resultCode == RESULT_OK) { 
          Log.d(TAG, "--> enter first if"); 
    
          final String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); 
          new DownloadTask(this).execute(accountName, spreadsheetName, worksheetName); 
    
         } else if (requestCode == 2 && resultCode == RESULT_OK) { 
          Log.d(TAG, "--> enter second if"); 
         } 
        } 
    
        //////////////////////////////////////////////////////////////////////////// 
    
        private class DownloadTask extends AsyncTask<String, Void, String> { 
    
         private Context context; 
    
         // constructor 
         public DownloadTask(Context context) { 
          this.context = context; 
         } 
    
         @Override 
         protected void onPreExecute() { 
          super.onPreExecute(); 
          showProgressDialog(context); 
         } 
    
         @Override 
         protected String doInBackground(String... params) { 
          String mEmail = params[0]; // your google account name 
          String mType = "com.google"; 
          Account account = new Account(mEmail, mType); 
          String scopes = "oauth2:https://spreadsheets.google.com/feeds " 
            + "https://www.googleapis.com/auth/plus.login " 
            + "https://www.googleapis.com/auth/drive"; 
          String token = null; 
          try { 
           token = GoogleAuthUtil.getToken(getApplicationContext(), account, scopes); 
          } catch (IOException e) { 
           Log.e(TAG, e.getMessage()); 
          } catch (UserRecoverableAuthException e) { 
           Intent recoveryIntent = e.getIntent(); 
           startActivityForResult(recoveryIntent, 2); 
          } catch (GoogleAuthException e) { 
           Log.e(TAG, e.getMessage()); 
          } 
    
          try { 
           SpreadsheetService service = new SpreadsheetService("MySpreadsheetIntegration-v1"); 
           service.setAuthSubToken(token); 
           URL SPREADSHEET_FEED_URL = new URL(
             "https://spreadsheets.google.com/feeds/spreadsheets/private/full"); 
           SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class); 
           List<SpreadsheetEntry> spreadsheets = feed.getEntries(); 
    
           Log.d(TAG, "spreadsheets.size() = " + spreadsheets.size()); 
    
           for (SpreadsheetEntry spreadsheet : spreadsheets) { // outer for loop 
            if (spreadsheet.getTitle().getPlainText().equalsIgnoreCase(params[1])) { // your spreadsheet name 
             List<WorksheetEntry> worksheets = spreadsheet.getWorksheets(); 
    
             for (WorksheetEntry worksheet : worksheets) { // inner for loop 
              String title = worksheet.getTitle().getPlainText(); 
              if (title.equalsIgnoreCase(params[2])) { // your worksheet name 
               Log.d(TAG, "Worksheet name: " + title); 
               URL listFeedUrl = worksheet.getListFeedUrl(); 
               ListFeed listFeed = service.getFeed(listFeedUrl, ListFeed.class); 
               Log.d(TAG, "Number of row = " + listFeed.getTotalResults()); 
    
               // scan through each row in worksheet 
               for (ListEntry row : listFeed.getEntries()) { 
                String rowTitle = row.getTitle().getPlainText(); 
                ArrayList<String> currentRow = new ArrayList<>(); 
    
                // get elements in current row stored in ArrayList 
                for (String element : row.getCustomElements().getTags()) { 
                 if (!row.getCustomElements().getValue(element).equals(rowTitle)) 
                  currentRow.add(row.getCustomElements().getValue(element)); 
                } 
                // Log.d(TAG, "currentRow.size() = "+currentRow.size()); 
    
                // do your work here with the data received 
    
               }` 
               break; // break inner 
              } 
             } 
             break; // break outer 
            } 
           } 
    
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
    
          return token; 
         } 
    
         @Override 
         protected void onPostExecute(String token) { 
          Log.d(TAG, "Token Value: " + token); 
          hideProgressDialog(); 
         } 
        } 
    } 
    
1

setUserCredentials에 설정 한 사용자 이름과 암호는 서버에 대한 요청을 인증하는 데 사용하는 자격 증명입니다. 개인 시트를받는 방법에 대한 질문은 documentation이 도움이 될 것 같아요. 더 많은 예제와 정보를 보려면 example code을 확인하십시오.