【问题标题】:App crashes while saving G+ photo url保存 G+ 照片网址时应用程序崩溃
【发布时间】:2018-03-28 04:33:44
【问题描述】:

在用户使用 Google 帐户登录后,我正在尝试保存 Google 电子邮件、姓名和个人资料照片网址。当使用谷歌默认头像的用户登录时,应用程序崩溃。它适用于具有自定义个人资料照片的 Google 帐户

以下是相关代码:

private void handleSignInResult(GoogleSignInResult result){

        Log.d(TAG,"handleSignInResult():"+result.isSuccess());
        if(result.isSuccess()){
            GoogleSignInAccount account = result.getSignInAccount();
            String pname = account.getDisplayName();
            String emailid = account.getEmail();
            String pic_url = new String(account.getPhotoUrl().toString());

            SharedPreferences userInfo = context.getSharedPreferences(getString(R.string.USER_INFO),Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = userInfo.edit();
            editor.putString("name",pname);
            editor.putString("email",emailid);
            editor.putString("pic_url",pic_url);
            editor.commit();
            updateUI(true);
        } else {
            updateUI(false);
        }
    }

这是 logcat 的一部分,但有异常:

--------- beginning of crash
10-16 20:02:33.731 32355 32355 E AndroidRuntime: FATAL EXCEPTION: main
10-16 20:02:33.731 32355 32355 E AndroidRuntime: Process: org.csikjsce.csi_kjsceofficial, PID: 32355
10-16 20:02:33.731 32355 32355 E AndroidRuntime: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=7, result=-1, data=Intent { (has extras) }} to activity {org.csikjsce.csi_kjsceofficial/org.csikjsce.csi_kjsceofficial.LoginActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at android.app.ActivityThread.deliverResults(ActivityThread.java:4112)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4155)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at android.app.ActivityThread.access$1600(ActivityThread.java:186)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1658)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:111)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:238)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:6016)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:937)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:798)
10-16 20:02:33.731 32355 32355 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at org.csikjsce.csi_kjsceofficial.LoginActivity.handleSignInResult(LoginActivity.java:179)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at org.csikjsce.csi_kjsceofficial.LoginActivity.onActivityResult(LoginActivity.java:207)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at android.app.Activity.dispatchActivityResult(Activity.java:6657)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    at android.app.ActivityThread.deliverResults(ActivityThread.java:4108)
10-16 20:02:33.731 32355 32355 E AndroidRuntime:    ... 9 more

行号207 次通话handleSignResult()

行号179 是String pic_url = new String(account.getPhotoUrl().toString());

注释掉第 179 行解决了这个问题,但是我无法保存我需要在我的应用中显示用户个人资料照片的照片网址。

该错误仅发生在其 Google 帐户中具有默认个人资料照片的用户身上。

我删除了我的 google plus 照片来测试它。我签名时应用程序崩溃了。然后我从 chrome 浏览器检查了我的 google plus 帐户上的照片 url,我得到了这个 url https://lh3.googleusercontent.com/-eKoJemxhXNk/AAAAAAAAAAI/AAAAAAAAAAA/ACnBePZ9iFrmxpc1l5CPyKJ4DRH14A_Scg/s60-p-rw-no-mo/photo.jpg

该 URL 类似于使用具有自定义个人资料照片的帐户登录时保存在 shared_pref.xml 中的 URL。 上面的 url 是 getPhotoUrl() 必须返回的。它绝对不为空,但我仍然在 getPhotoUrl().toString() 上得到 NPE 并且应用程序崩溃。

有人可以解释为什么会这样吗?

【问题讨论】:

    标签: android google-signin


    【解决方案1】:

    这个简单的技巧解决了错误:

    String pic_url = ""+account.getPhotoUrl();
    

    在寻找 getPhotoUrl() 方法后,我发现 this

    我已经使用DEFAULT_SIGN_IN 标志配置了登录,但第一个条件即

    如果用户有头像

    相当于用户拥有默认头像。所以所有有默认头像的用户都不满足第一个条件,所以方法返回null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      相关资源
      最近更新 更多