Android + Google API で ConnectionResult{statusCode=INTERNAL_ERROR, resolution=null} が出たときのデバッグ方法


INTERNAL_ERROR だけでは何が悪いのかわかりません

けつろん

  • 詳細なトレースを出そう
  • Google API Console をよく見直そう
  • だいたいSHA1フィンガープリントが間違っていることが多い
  • 原因不明だが再登録して直ることもある

まずやること

以下の対応をしてトレースに出る内容を増やす。HTTP のリクエスト、レスポンスの詳細がわかるようになる。INVALID_CLIENT_ID とか教えてくれます。

Logger.getLogger(HttpTransport.class.getName()).setLevel(Level.CONFIG);
% adb shell setprop log.tag.httptransport debug

Google API Console に登録した SHA1 のフィンガープリントとパッケージ名を見直す

SHA1の確認

% keytool -exportcert -alias youraliasname -keystore yourkeystore.keystore -list -v

念のためアプリ自身からSHA1を出力

違うkeystoreが使用されいている可能性もあるので、以下のコードで確認してみる。※リリース時には消そう

    private String getCertificateSHA1Fingerprint() throws java.security.cert.CertificateException {
        PackageManager pm = this.getPackageManager();
        String packageName = this.getPackageName();
        int flags = PackageManager.GET_SIGNATURES;
        PackageInfo packageInfo = null;
        try {
            packageInfo = pm.getPackageInfo(packageName, flags);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        Signature[] signatures = packageInfo.signatures;
        byte[] cert = signatures[0].toByteArray();
        InputStream input = new ByteArrayInputStream(cert);
        CertificateFactory cf = null;
        try {
            cf = CertificateFactory.getInstance("X509");
        } catch (CertificateException e) {
            e.printStackTrace();
        }
        X509Certificate c = null;
        try {
            c = (X509Certificate) cf.generateCertificate(input);
        } catch (CertificateException e) {
            e.printStackTrace();
        }
        String hexString = null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA1");
            byte[] publicKey = md.digest(c.getEncoded());
            hexString = byte2HexFormatted(publicKey);
        } catch (NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        } catch (CertificateEncodingException e) {
            e.printStackTrace();
        }
        return hexString;
    }

    public static String byte2HexFormatted(byte[] arr) {
        StringBuilder str = new StringBuilder(arr.length * 2);
        for (int i = 0; i < arr.length; i++) {
            String h = Integer.toHexString(arr[i]);
            int l = h.length();
            if (l == 1) h = "0" + h;
            if (l > 2) h = h.substring(l - 2, l);
            str.append(h.toUpperCase());
            if (i < (arr.length - 1)) str.append(':');
        }
        return str.toString();
    }

さんこう

  • android - Error : ConnectionResult{statusCode=INTERNAL_ERROR, resolution=null} - Stack Overflow - http://goo.gl/rF1n2S
  • google api - G+ signin on android throws INVALID_CLIENT_ID - Stack Overflow - http://goo.gl/IhsBVs