Ich verwende sign in with Slack API
.Verwenden Sie dynamische URL mit Retrofit
ein Zugriffstoken zu erhalten, gibt es eine HTTP-GET-Anforderung ist:
Diese URL ist autorisieren, verwende ich diese für die Anmeldung und implementiert über WebView
:
Ich verwende WebView
für Login-Integration.
Meine Klassen sind:
public class LoginApiClient {
private static LoginService loginService;
public static LoginService getLoginService(){
if (loginService != null){
Retrofit retrofitClient = new Retrofit.Builder()
.baseUrl("https://slack.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
loginService = retrofitClient.create(LoginService.class);
}
return loginService;
}
}
public interface LoginService {
@FormUrlEncoded
@GET("api/oauth.access")
Call<LoginResponse> makeUserLogin(@FieldMap Map<String, String > parameter);
}
public class LoginResponse {
.....
@SerializedName("access_token")
@Expose
private String accessToken;
.....
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
}
In meiner Aktivitätsklasse, innen shouldOverrideUrlLoading
Methode:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("http://localhost:8000/")) {
UrlQuerySanitizer urlQuerySanitizer = new UrlQuerySanitizer(url);
codeParams = urlQuerySanitizer.getValue("code");
Log.e(TAG, "shouldOverrideUrlLoading: " + codeParams);
retrieveToken();
return true;
} else {
view.loadUrl(url);
return true;
}
}
private void retrieveToken() {
LoginService loginService = LoginApiClient.getLoginService();
Map<String, String> urlParameter = new HashMap<>();
urlParameter.put("client_id", StringConstant.CLIENT_ID);
urlParameter.put("client_secret", StringConstant.CLIENT_SECRET);
urlParameter.put("code", codeParams);
Call<LoginResponse> call = loginService.makeUserLogin(urlParameter);
call.enqueue(new Callback<LoginResponse>() {
@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
//navigate to next activity after saving token
}
@Override
public void onFailure(Call<LoginResponse> call, Throwable t) {
}
});
}
Es wird nun die Nullpointer Fehler zu werfen, und ich denke, dass die URL nicht funktioniert, so dass ich bekomme das.
java.lang.NullPointerException: Versuch Schnittstelle Methode aufzurufen 'retrofit2.Call com.loginApi.LoginService.makeUserLogin (java.util.Map)' auf null Objektreferenz
Wie kann ich Wissen Sie, dass die HTTP-GET-Anfrage-URL trifft? Wie kann ich die URL erstellen und nach dem Login wird es getroffen und ich bekomme Token?
Können Sie diese Überprüfung entfernen, wenn (LoginService! = Null) und einmal versuchen? Lassen Sie die statische Methode neue Instanzen zurückgeben. Wahrscheinlich wird es im Anwendungslauf gelöscht, deshalb erhalten Sie null Punkt Ausnahme – Stallion
Ihre Informationen werden für mich hilfreich sein, wenn Sie klären, was kann ich entfernen? Und, '(loginService! = Null)' ist immer 'wahr'. –
In Ihrem obigen Code kann ich nur eine Zeile sehen, die dasselbe erwähnt. Sie fragen sich, warum Sie nicht in Ihrem Code selbst erkennen konnten? Wie gesagt, immer neue Instanz zurückgeben, als diese Bedingung überprüfen und versuchen – Stallion