Android GoogleAccountCredential-[错误]名称不能为空:null-尽管有权限
我一直在开发一款应用程序,它在某些时候会将少量数据发送回谷歌工作表,但我无法让它正常工作:Android GoogleAccountCredential-[错误]名称不能为空:null-尽管有权限,android,google-sheets,runtime-error,google-account,Android,Google Sheets,Runtime Error,Google Account,我一直在开发一款应用程序,它在某些时候会将少量数据发送回谷歌工作表,但我无法让它正常工作: public void SheetUpdate() { GoogleAccountCredential mCredential; Sheets mService; final String[] SCOPES = { SheetsScopes.SPREADSHEETS }; mCredential = GoogleAccountCredential.usingOAuth2
public void SheetUpdate() {
GoogleAccountCredential mCredential;
Sheets mService;
final String[] SCOPES = { SheetsScopes.SPREADSHEETS };
mCredential = GoogleAccountCredential.usingOAuth2(getApplicationContext(), Arrays.asList(SCOPES))
.setBackOff(new ExponentialBackOff())
.setSelectedAccountName("oscarcookeabbott@gmail.com");
Log.e("DEBUG", "SheetUpdate: " + mCredential.getSelectedAccountName());
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
mService = new Sheets.Builder(transport, jsonFactory, mCredential)
.setApplicationName("Listeau")
.build();
/*
String range = "[Sheet Name]![Start]:[End]";
mService.spreadsheets().values().update(enumId, range, valueRange)
.setValueInputOption("RAW")
.execute();
*/
ValueRange values = new ValueRange();
values.set("EMAIL", "tonyjones@abc.net.au");
values.set("AUTH", "[INSERT DATE]");
values.set("SUB", "[INSERT DATE + MONTH]");
try {
mService.spreadsheets().values().append("1meAAvjdPmghn6wl_IKc-_NJx_M85I_yqsn4Nwm_j_X0", "Users", values)
.setValueInputOption("RAW")
.execute();
} catch(IOException e) {
Log.e("BUG", "SheetUpdate: IOException");
}
}
在我的清单中,我有:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
`您的execute()
调用通过您创建的GoogleAccountCredential
对象进行,该对象在内部失败
查看的代码是开源的,您可以看到传入的名称为null。调用方,GoogleAuthUtil
,是Play Services库的一个封闭源代码部分,但我们可以很好地猜测发生了什么。它试图从手机的设置中获取谷歌账户,但未能找到匹配项
正如您已经怀疑的,权限是这里的一个因素,我认为这是您失败的原因。针对Android 6及以上版本时,在清单中声明权限可能不够,在您的情况下,GET_ACCOUNTS
会受到影响。看
您需要在运行时请求权限(并干净地处理被用户拒绝的情况)。请参阅以了解如何做到这一点。或者,如果您没有任何相关的依赖项,您可以将目标级别降低到5.1或更低,至少现在,它将使用旧的权限模型。今天我遇到了相同的错误。但我终于成功了。我在这里描述了我所做的,所以这对任何人都有帮助 因此,原因是:
mCredential.getSelectedAccountName()==null
因此,我这样调用,如果api调用成功与否:
private void getResultsFromApi() {
if (! isGooglePlayServicesAvailable()) {
acquireGooglePlayServices();
} else if (mCredential.getSelectedAccountName() == null) {
chooseAccount();
} else if (! isDeviceOnline()) {
mOutputText.setText("No network connection available.");
} else {
Toast.makeText(this, "API CALL SUCCESS", Toast.LENGTH_SHORT).show();
}
}
当我收到上面的消息API CALL SUCCESS
时,我调用readData或Append Data函数。然后数据读取或追加成功
因此,请仔细检查
mCredential.getSelectedAccountName()!=空值
表示成功。更多信息将非常有用-日志输出是什么?使用输出编辑帖子您找到解决方案了吗?但是,1。实际上,我并没有向手机请求任何信息,我只是给它一封静态电子邮件,名为和和2。当我在Jellybean上尝试它时,它会返回相同的错误吗?
private void getResultsFromApi() {
if (! isGooglePlayServicesAvailable()) {
acquireGooglePlayServices();
} else if (mCredential.getSelectedAccountName() == null) {
chooseAccount();
} else if (! isDeviceOnline()) {
mOutputText.setText("No network connection available.");
} else {
Toast.makeText(this, "API CALL SUCCESS", Toast.LENGTH_SHORT).show();
}
}