AndroidアプリからGoogleのスプレッドシート APIを用いて、スプレッドシート に書き込んだデータを読み込んだり、書き込んだりってことを実現できるようにAndroid Studioを使って、Androidアプリを実装してみました。
2022/5/4更新
Googleスプレッドシート とは
エクセルのような表計算ソフトです。WEBブラウザで使用できるようになっており、Excelと違い、インターネット上で動作しているため、プログラミングで、通信を利用して、データを保存したり、読み込んだりできます。
Googleスプレッドシート APIでできること
Googleスプレッドシート の作成や閲覧や編集や削除など可能です。今回作成するAndroidアプリの開発では、あらかじめ用意したspreadsheetに対して、アンドロイドアプリから読み込み、書き込みをできるようにしていきます。
Google API利用準備
開発者登録を実施する
プロジェクトを作成する
GoogleAPIsの画面より、青丸で囲ったところを押スト、プロジェクトの作成が出てきます。
プロジェクトの選択画面から、新しいプロジェクトを選択
新しいプロジェクを選択したら、任意のプロジェクト名を入力
androidアプリで、スプレッドシート を操作できるようにするGoogleAPIsのプロジェクトだよってのが識別できれば良いです。
スプレッドシート APIを有効にする
プロジェクトの作成ができると、ダッシュボードを押すと、写真のようにAPIライブラリに移動というところが出てくるので、そこを押す
GoogleAPIライブラリに移動するので、Google Workspaceのところから、全て表示を押す。
スクロールしていくと、Google sheets APIが出てくるので、そこをクリックする
Google Sheets APIを選択すると、した画像のように、有効にするボタンが出てくるので、有効にするを押す。
androidアプリからgoogle spread sheets APIにアクセスできるように認証情報を作成する
Google sheets APIが有効にできたら、andoroidアプリから、アクセスできるようにするために、認証情報を作成します。
図のように、認証情報を作成をクリックします
認証情報の作成
・図のように選択してください
選択できたら必要な認証情報をおす
OAuth同意画面の設定
androidアプリから個人のスプレッドシート にアクセスするわけなので、誰がアクセスするのかの同意画面が必要になるので、
同意画面を設定を押します
OAuth同意画面の設定は、
User typeを外部と選択して、作成を押します。
OAuth同意画面を作成すると、アプリ名やらなんやらかんやら入力する画面が出てきますが、適当に埋めていきます。必須のところだけでOK
テストユーザーの追加
スプレッドシート にアクセスして良い人をここに登録します。
ここでは、自分のGMAILアドレスを入力すればOK
APIキーの作成とOAuth2.0クライアントIDの作成
OAuth同意画面の作成ができたら、右側の「認証情報」をクリックし、「認証情報を作成」をクリック
OAuthクライアントID作成
以下の図より、必要事項を入力する
・パッケージ名は次の画像の通り、androidアプリを作成した時に、自動生成されるbuild.gradle(Module:app)に表記あるので、解説します。
・SHA-1証明書のフィンガープリントも次項で解説します
パッケージ名を調べる
android studioを開いて、空のプロジェクト(androidアプリ)を作成します。取り敢えず、EmptyActivityを選択しアプリを作ると、以下のように、自動的にbuild.gradle(Module:app)作成され、その中に、パッケージ名が含まれるので、そこを確認してください
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
apply plugin: 'com.android.application' android { ... defaultConfig { applicationId "パッケージ名" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } ... } ... |
SHA-1証明書のフィンガープリントの調べ方
まずはJAVAがインストールされたフォルダを探す
windows環境なら
1 |
C:\Users\ユーザー名\.android |
Mac環境なら
1 |
/Users/ユーザー名/.android |
このフォルダの中に、debug.keystoreというファイルがあると思うので、ターミナルを開いて、
1 |
keytool -list -v -keystore |
と入力して、先ほどのファイルをドラッグ&ドロップします。
要は、以下のようにターミナルに入っていればOKでう。ユーザー名などディレクトリはご自身の環境に合わせて変更してください。
1 2 |
keytool -list -v -keystore /Users/ユーザー名/.android/debug.keystore |
入力できたらエンターキーを押すと、パスワード入力を求められるので、
android
とパスワードを入力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
(base) ユーザー名 .android % keytool -list -v -keystore /Users/ユーザー名/.android/debug.keystore キーストアのパスワードを入力してください: キーストアのタイプ: JKS キーストア・プロバイダ: SUN キーストアには1エントリが含まれます 別名: androiddebugkey 作成日: 2021/02/13 エントリ・タイプ: PrivateKeyEntry 証明書チェーンの長さ: 1 証明書[1]: 所有者: C=US, O=Android, CN=Android Debug 発行者: C=US, O=Android, CN=Android Debug シリアル番号: 1 有効期間の開始日: Sat Feb 13 01:33:26 JST 2021終了日: Mon Feb 06 01:33:26 JST 2051 証明書のフィンガプリント: SHA1: D3:25:64:秘密!!!05:D3:49:82:4F SHA256: 4D:28:41:0B:2C秘密!!EB:CB:A5:F2 署名アルゴリズム名: S秘密!!!!!SA (弱) サブジェクト公開キー・アルゴリズム: 2048ビットRSAキー バージョン: 1 ******************************************* ******************************************* |
上記のようにターミナルに表示されるので、SHA1のところをOAuthクライアントID入力欄のSHA-1証明書のフィンガープリントのところへ入力すればOK
これでOAuthクライアントIDは作成完了
APIキーの作成方法
認証情報を作成ボタンを押すと、APIキーが選べるのでそこを押す
ここは何もしなくても、画面の指示に従えば、APIキーが発行できますので、発行されたAPIキーをメモしておきます
Android Studioでアプリ側の作成を開始
build.gradleにライブラリ情報追加
Google スプレッドシート APIを使用するために必要なライブラリを読み込み
(Module: app)のbuild.gradleを以下のように書き換えてください
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
plugins { id 'com.android.application' } android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { applicationId "info.costperformance.jtest" minSdkVersion 28 targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' // google sheetsAPI用ライブラリ ここ以下を追加します compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' implementation 'com.android.support:support-annotations:28.0.0' compile 'com.google.android.gms:play-services-auth:9.0.2' compile 'pub.devrel:easypermissions:0.1.5' compile('com.google.api-client:google-api-client-android:1.22.0') { exclude group: 'org.apache.httpcomponents' } compile('com.google.apis:google-api-services-sheets:v4-rev10-1.22.0') { exclude group: 'org.apache.httpcomponents' } } |
AndroidManifest.xmlを編集
自動生成されたアンドロイドマニュフェストに、ネットワーク接続のパーミッションを追加します。あと、グーグルサービスのメタ情報を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="info.costperformance.jtest"> <!--ネットワーク接続の許可を追加--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Jtest"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--meta情報を追加--> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </application> </manifest> |
データ読み書き用のスプレッドシート 作成
・適当でいいので、スプレッドシート に書き込みます。
・シート名を1「data1」にしてください(任意ですが、今回のサンプルプログラムの中に、data1としてるので)
・ファイル名もなんでもいいです。
・必ず共有ユーザーにGoogleSHeetAPIで設定した時のGoogleアカウントを追加しておいてください(テストユーザーと同じ人を共有)
android studioでコード作成
取り敢えず、以下のコードをコピーし貼り付けてもらえれば動きます。
ここからの改良はそれぞれの方が実施してください
MainActivity.java
以下の部分だけ、データ書き込み用に作成したスプレッドシート のURLのhttps://docs.google.com/spreadsheets/d/ここの文字列/edit#gid=0 の赤字の部分を以下のコードに適応させます
private List getDataFromApi() throws IOException {
String spreadsheetId = "ここに自分で作成したスプレッドシート のURLを貼り付ける";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 |
package info.costperformance.jtest; import android.Manifest; import android.accounts.AccountManager; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.AsyncTask; import android.os.Bundle; import androidx.annotation.NonNull; //import android.support.annotation.NonNull; import android.text.TextUtils; import android.text.method.ScrollingMovementMethod; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.api.client.extensions.android.http.AndroidHttp; import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential; import com.google.api.client.googleapis.extensions.android.gms.auth.GooglePlayServicesAvailabilityIOException; import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.client.util.ExponentialBackOff; import com.google.api.services.sheets.v4.SheetsScopes; import com.google.api.services.sheets.v4.model.ValueRange; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.EasyPermissions; public class MainActivity extends Activity implements EasyPermissions.PermissionCallbacks { GoogleAccountCredential mCredential; private TextView mOutputText; private Button mCallApiButton; ProgressDialog mProgress; static final int REQUEST_ACCOUNT_PICKER = 1000; static final int REQUEST_AUTHORIZATION = 1001; static final int REQUEST_GOOGLE_PLAY_SERVICES = 1002; static final int REQUEST_PERMISSION_GET_ACCOUNTS = 1003; 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_READONLY}; /** * Create the main activity. * * @param savedInstanceState previously saved instance data. */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout activityLayout = new LinearLayout(this); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); activityLayout.setLayoutParams(lp); activityLayout.setOrientation(LinearLayout.VERTICAL); activityLayout.setPadding(16, 16, 16, 16); ViewGroup.LayoutParams tlp = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); mCallApiButton = new Button(this); mCallApiButton.setText(BUTTON_TEXT); mCallApiButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCallApiButton.setEnabled(false); mOutputText.setText(""); getResultsFromApi(); mCallApiButton.setEnabled(true); } }); activityLayout.addView(mCallApiButton); mOutputText = new TextView(this); mOutputText.setLayoutParams(tlp); mOutputText.setPadding(16, 16, 16, 16); mOutputText.setVerticalScrollBarEnabled(true); mOutputText.setMovementMethod(new ScrollingMovementMethod()); mOutputText.setText( "Click the \'" + BUTTON_TEXT + "\' button to test the API."); activityLayout.addView(mOutputText); mProgress = new ProgressDialog(this); mProgress.setMessage("Calling Google Sheets API ..."); setContentView(activityLayout); // Initialize credentials and service object. mCredential = GoogleAccountCredential.usingOAuth2( getApplicationContext(), Arrays.asList(SCOPES)) .setBackOff(new ExponentialBackOff()); } /** * Attempt to call the API, after verifying that all the preconditions are * satisfied. The preconditions are: Google Play Services installed, an * account was selected and the device currently has online access. If any * of the preconditions are not satisfied, the app will prompt the user as * appropriate. */ private void getResultsFromApi() { if (!isGooglePlayServicesAvailable()) { acquireGooglePlayServices(); } else if (mCredential.getSelectedAccountName() == null) { chooseAccount(); } else if (!isDeviceOnline()) { mOutputText.setText("No network connection available."); } else { new MakeRequestTask(mCredential).execute(); } } /** * Attempts to set the account used with the API credentials. If an account * name was previously saved it will use that one; otherwise an account * picker dialog will be shown to the user. Note that the setting the * account to use with the credentials object requires the app to have the * GET_ACCOUNTS permission, which is requested here if it is not already * present. The AfterPermissionGranted annotation indicates that this * function will be rerun automatically whenever the GET_ACCOUNTS permission * is granted. */ @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) { mCredential.setSelectedAccountName(accountName); getResultsFromApi(); } else { // 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); } } /** * Called when an activity launched here (specifically, AccountPicker * and authorization) exits, giving you the requestCode you started it with, * the resultCode it returned, and any additional data from it. * * @param requestCode code indicating which activity result is incoming. * @param resultCode code indicating the result of the incoming * activity result. * @param data Intent (containing result data) returned by incoming * activity result. */ @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) { mOutputText.setText( "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; } } /** * Respond to requests for permissions at runtime for API 23 and above. * * @param requestCode The request code passed in * requestPermissions(android.app.Activity, String, int, String[]) * @param permissions The requested permissions. Never null. * @param grantResults The grant results for the corresponding permissions * which is either PERMISSION_GRANTED or PERMISSION_DENIED. Never null. */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult( requestCode, permissions, grantResults, this); } /** * Callback for when a permission is granted using the EasyPermissions * library. * * @param requestCode The request code associated with the requested * permission * @param list The requested permission list. Never null. */ @Override public void onPermissionsGranted(int requestCode, List<String> list) { // Do nothing. } /** * Callback for when a permission is denied using the EasyPermissions * library. * * @param requestCode The request code associated with the requested * permission * @param list The requested permission list. Never null. */ @Override public void onPermissionsDenied(int requestCode, List<String> list) { // Do nothing. } /** * Checks whether the device currently has a network connection. * * @return true if the device has a network connection, false otherwise. */ private boolean isDeviceOnline() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); return (networkInfo != null && networkInfo.isConnected()); } /** * Check that Google Play services APK is installed and up to date. * * @return true if Google Play Services is available and up to * date on this device; false otherwise. */ private boolean isGooglePlayServicesAvailable() { GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); final int connectionStatusCode = apiAvailability.isGooglePlayServicesAvailable(this); return connectionStatusCode == ConnectionResult.SUCCESS; } /** * Attempt to resolve a missing, out-of-date, invalid or disabled Google * Play Services installation via a user dialog, if possible. */ private void acquireGooglePlayServices() { GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); final int connectionStatusCode = apiAvailability.isGooglePlayServicesAvailable(this); if (apiAvailability.isUserResolvableError(connectionStatusCode)) { showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode); } } /** * Display an error dialog showing that Google Play Services is missing * or out of date. * * @param connectionStatusCode code describing the presence (or lack of) * Google Play Services on this device. */ void showGooglePlayServicesAvailabilityErrorDialog( final int connectionStatusCode) { GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); Dialog dialog = apiAvailability.getErrorDialog( MainActivity.this, connectionStatusCode, REQUEST_GOOGLE_PLAY_SERVICES); dialog.show(); } /** * An asynchronous task that handles the Google Sheets API call. * Placing the API calls in their own task ensures the UI stays responsive. */ private class MakeRequestTask extends AsyncTask<Void, Void, List<String>> { private com.google.api.services.sheets.v4.Sheets mService = null; private Exception mLastError = null; MakeRequestTask(GoogleAccountCredential credential) { 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(); } /** * Background task to call Google Sheets API. * * @param params no parameters needed for this task. */ @Override protected List<String> doInBackground(Void... params) { try { return getDataFromApi(); } catch (Exception e) { mLastError = e; cancel(true); return null; } } /** * Fetch a list of names and majors of students in a sample spreadsheet: * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit * * @return List of names and majors * @throws IOException */ private List<String> getDataFromApi() throws IOException { String spreadsheetId = "ここに自分で作成したスプレッドシート のURLを貼り付ける"; //String range = "GroupMar!A2:C"; String range = "data1!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("スプレッドシート から読み込んだ値"); //results.add("Name, Major"); for (List row : values) { results.add(row.get(0) + ", " + row.get(1) + ", " + row.get(2) + ", " + row.get(3)); } } return results; } @Override protected void onPreExecute() { mOutputText.setText(""); mProgress.show(); } @Override protected void onPostExecute(List<String> output) { mProgress.hide(); if (output == null || output.size() == 0) { mOutputText.setText("No results returned."); } else { output.add(0, "Data retrieved using the Google Sheets API:"); mOutputText.setText(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(), MainActivity.REQUEST_AUTHORIZATION); } else { mOutputText.setText("The following error occurred:\n" + mLastError.getMessage()); } } else { mOutputText.setText("Request cancelled."); } } } } //import androidx.appcompat.app.AppCompatActivity; // //import android.os.Bundle; //import android.view.View; //import android.widget.Button; //import android.widget.TextView; // //public class MainActivity extends AppCompatActivity { // // private TextView textView; // private boolean buttonTap = false; // // @Override // protected void onCreate(Bundle savedInstanceState) { // super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); // // //ボタンを設定 // Button button = findViewById(R.id.button); // // //テキストビューの設定 // textView = findViewById(R.id.text_view); // // button.setOnClickListener( v -> { // // flagがtrueの時 // if (buttonTap) { // textView.setText("Hello"); // buttonTap = false; // } // // flagがfalseの時 // else { // textView.setText("うんちマン"); // buttonTap = true; // } // }); // // } //} |
これで完成 実行してみよう
こんな感じで読み込み完了できました。
次回は、データの書き込みができるようにしてみます。