Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android GoogleAccountCredential-[错误]名称不能为空:null-尽管有权限_Android_Google Sheets_Runtime Error_Google Account - Fatal编程技术网

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();

          }
    }