最近,我有Android代码访问Google云端硬盘.我正在使用Google API Client Library for Java而不是Google Play服务客户端库
private static GoogleCloudFile searchFromGoogleDrive(Drive drive, String qString, HandleUserRecoverableAuthIOExceptionable h, PublishProgressable p) { try { Files.List request = drive.files().list().setQ(qString); do { if (p.isCancelled()) { return null; } FileList fileList = request.execute();
如果我使用,代码可以在几年内完成100%罚款targetSdkVersion 21
.
最近,我将我的应用迁移到targetSdkVersion 23
了Google Drive相关代码的0更改.
但是,代码崩溃了FileList fileList = request.execute();
,但有以下异常.
Process: org.yccheok.jstock.gui, PID: 30317 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.IllegalArgumentException: the name must not be empty: null at android.accounts.Account.(Account.java:48) at com.google.android.gms.auth.zzd.getToken(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:255) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:279) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460) at org.yccheok.jstock.gui.Utils.searchFromGoogleDrive(Utils.java:208) at org.yccheok.jstock.gui.Utils._loadFromGoogleDrive(Utils.java:277) at org.yccheok.jstock.gui.Utils.loadFromGoogleDrive(Utils.java:344) at org.yccheok.jstock.gui.LoadFromCloudTask.doInBackground(LoadFromCloudTask.java:23) at org.yccheok.jstock.gui.LoadFromCloudTask.doInBackground(LoadFromCloudTask.java:9) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818)
如果我谷歌,我得到谷歌驱动器上的Android错误:java.lang.IllegalArgumentException:名称不能为空:null,表明帐户名称不传递给凭证对象.
但是,我非常确定我的凭证对象是以有效的帐户名传递的(格式为xxx@gmail.com)
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { switch (requestCode) { case RequestCode.REQUEST_ACCOUNT_PICKER_LOAD_FROM_CLOUD: if (resultCode == RESULT_OK && data != null && data.getExtras() != null) { String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); Log.i("CHEOK", "accountName = " + accountName); if (accountName != null) { JStockApplication.instance().getJStockOptions().setUsername(accountName); Utils.getGoogleAccountCredential().setSelectedAccountName(accountName);
public static GoogleAccountCredential getGoogleAccountCredential() { return googleAccountCredential; } private static final GoogleAccountCredential googleAccountCredential = GoogleAccountCredential.usingOAuth2(JStockApplication.instance(), Arrays.asList( DriveScopes.DRIVE_APPDATA, // Legacy. Shall be removed after a while... DriveScopes.DRIVE ) ); private Drive getDriveService() { return new Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), Utils.getGoogleAccountCredential()).build(); }
此外,我非常确定我的OAuth 2.0正确通过Google Developers Console(适用于调试密钥库和生产密钥库)最近,Android 6引入了运行时权限.我在想,这个例外可以与此相关吗?
我进一步尝试使用最新的库版本1.21.0.但是,我仍然得到类似的错误日志
java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.IllegalArgumentException: the name must not be empty: null at android.accounts.Account.(Account.java:48) at com.google.android.gms.auth.zzd.getToken(Unknown Source) at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:255) at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:279) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) at org.yccheok.jstock.gui.Utils.searchFromGoogleDrive(Utils.java:208) at org.yccheok.jstock.gui.Utils._loadFromGoogleDrive(Utils.java:277) at org.yccheok.jstock.gui.Utils.loadFromGoogleDrive(Utils.java:344) at org.yccheok.jstock.gui.LoadFromCloudTask.doInBackground(LoadFromCloudTask.java:23) at org.yccheok.jstock.gui.LoadFromCloudTask.doInBackground(LoadFromCloudTask.java:9) at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) at java.lang.Thread.run(Thread.java:818)
我在使用Nexus 5,Android版本6.0.1进行测试时会生成以上2个错误日志
但是,如果我使用Nexus 4,Android版本5.1.1进行相同的测试,则不会发生错误!1.18.0-rc和1.21.0都运行良好
因此,似乎崩溃与Android版本密切相关.
它看起来像是用于Java的Drive API Client Library调用GoogleAuthUtil.getToken()
,这需要GET_ACCOUNTS
权限.您需要在清单中具有该权限,并在运行时根据需要请求它.
我遇到了同样的问题,所有权限均被授予,但仍然出现此错误。
我简单的问题是,是,googleSignInAccount.getSignInAccount().getAccount()
是null
。如果您不请求电子邮件权限(GoogleSignInOptions.Builder.requestEmail
),就是这种情况。好像没有用户电子邮件就无法创建此帐户。
因此,请确保将此权限添加到GoogleSignInOptions
...