Como o aplicativo que fiz era para versões internacionais, de repente disse que o login do Twitter falhou nos últimos dois dias. Verifiquei vários motivos e soluções, finalmente resolvi e apresentei duas soluções.
O chefe do Twitter atualizou o mecanismo de autorização e autenticação, e o back-end do aplicativo não foi atualizado, o que causou uma grande área de problemas de login, que foi muito reduzida!
Descrição do Problema
Se o cliente Twitter estiver instalado no telefone celular, ele não terá efeito. Se não estiver instalado, ele solicitará uma falha de login e não poderá fazer login.
Sem mais delongas, conecte-se ao telefone para ler o registro:
06-15 16:22:25.734 1015-1015/com.example.testlogin E/Twitter: Invalid json: <?xml version="1.0" encoding="UTF-8"?><errors><error code="415">Callback URL not approved for this client application. Approved callback URLs can be adjusted in your application settings</error></errors>
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
at com.twitter.sdk.android.core.models.SafeListAdapter$1.read(SafeListAdapter.java:45)
at com.twitter.sdk.android.core.models.SafeMapAdapter$1.read(SafeMapAdapter.java:45)
at com.google.gson.Gson.fromJson(Gson.java:887)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
at com.google.gson.Gson.fromJson(Gson.java:773)
at com.twitter.sdk.android.core.TwitterApiException.parseApiError(TwitterApiException.java:110)
at com.twitter.sdk.android.core.TwitterApiException.readApiError(TwitterApiException.java:95)
at com.twitter.sdk.android.core.TwitterApiException.<init>(TwitterApiException.java:43)
at com.twitter.sdk.android.core.Callback.onResponse(Callback.java:42)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
at com.twitter.sdk.android.core.models.SafeListAdapter$1.read(SafeListAdapter.java:45)
at com.twitter.sdk.android.core.models.SafeMapAdapter$1.read(SafeMapAdapter.java:45)
at com.google.gson.Gson.fromJson(Gson.java:887)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
at com.google.gson.Gson.fromJson(Gson.java:773)
at com.twitter.sdk.android.core.TwitterApiException.parseApiError(TwitterApiException.java:110)
at com.twitter.sdk.android.core.TwitterApiException.readApiError(TwitterApiException.java:95)
at com.twitter.sdk.android.core.TwitterApiException.<init>(TwitterApiException.java:43)
at com.twitter.sdk.android.core.Callback.onResponse(Callback.java:42)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
Há uma string abaixo, mas esse é o motivo principal, então não vou ler abaixo. Durante a análise, a análise json falhou. Normalmente, foi bem-sucedida. Agora uma string de código xml é retornada, o que obviamente falhou. Então o problema é a descrição errada no xml.
URL de retorno de chamada não aprovado para este aplicativo cliente. URLs de retorno de chamada aprovados podem ser ajustados nas configurações do seu aplicativo
. Este é o problema. Há um problema com a configuração do URL de retorno no plano de fundo do aplicativo do Twitter, mas isso não foi movido. Por que ele para de funcionar repentinamente?
Achar uma solução
Verificar se o Twitter está fazendo alguma coisa? Com certeza, finalmente descobri que o Twitter emitiu um anúncio em maio, lembrando os usuários que fazem login usando o Twitter. Se eles precisarem continuar fazendo login usando o Twitter, eles precisam adicionar o URL de retorno de chamada à lista de permissões no plano de fundo do aplicativo. OK, a solução está aí, no final O que preencher? Para dizer a verdade, os funcionários do Twitter não deixaram isso claro e tem havido perguntas em todos os lugares atualmente. . . . .
Durante o período, vários blogs, comunidades e sites oficiais descreveram o Callback URL e apenas preencher um endereço que possa ser acessado.Também escrevi um wave de acordo com o android-kit oficial integrado, mas ainda não funciona, mesmo erro. colapso.
Solução 1
Finalmente encontrei um problema em um URL de retorno de chamada, é dito ser url oficial do Twitter, use-o para preencher nossa lista de permissões de plano de fundo do aplicativo. O ok
para isso é: twittersdk: //
Depois de preencher assim:
Desta forma, o cliente não precisa mexer em nada e continuar a usá-lo normalmente.
Solução 2
Outra solução, essa mudança é grande, e o código do cliente precisa ser atualizado. Por causa da urgência, também aprendi sobre a onda e escrevi uma demonstração para recebê-la (aí encontrei a primeira solução e voltei em minutos Código de retorno).
Esta solução é usar a API de autorização Auth do Twitter para carregar a página diretamente, sim, carregue-a você mesmo.
Há uma interface de API para autenticação na api do site oficial do desenvolvedor do Twitter. O
parâmetro é um oauth_token que deve ser passado e
finalmente montado em um URL e uma página.
Então, o que precisamos carregar é esta página, basta escrever um webView para carregar este endereço!
Por fim, como obter o token, faça upload do código diretamente:
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setOAuthConsumerKey(KEY);
configurationBuilder.setOAuthConsumerSecret(SECRET);
Configuration configuration = configurationBuilder.build();
mTwitter = new TwitterFactory(configuration).getInstance();
new Thread(new Runnable() {
@Override
public void run() {
try {
requestToken = mTwitter.getOAuthRequestToken();
runOnUiThread(new Runnable() {
@Override
public void run() {
webView.loadUrl(requestToken.getAuthenticationURL());
}
});
}catch (twitter4j.TwitterException e) {
e.printStackTrace();
}
}
}).start();
Dessa forma, você também pode entrar na página de autorização e, em seguida, ouvir em WebviewClient.Quando você entra na página de autorização após fazer o login, você pode fornecer outro método para obter informações do usuário através do Twitter.
accessToken = mTwitter.getOAuthAccessToken(requestToken, strVerifier);
O requestToken é o token e o strVerifier que obtivemos antes. Nós o obtemos do url. Há um parâmetro no link para a página da Web de autorização chamado oauth_verifier . Obtemos esse parâmetro por meio de uri.getQueryParameter ("oauth_verifier").
Observe que esta é uma operação de rede demorada.
Finalmente, as informações no AccessToken são as informações dos usuários do Twitter.
Pisando no registro das boxes, espero ajudar a todos.