2016-07-27 10 views
1

Ich freue mich, eine App zu implementieren, die Spotify verbindet. Um Spotify-Dienste nutzen zu können, benötige ich ein Token, das ich mit dem Spotify SDK erhalten kann. Dieses Token ist jedoch für den schnellen Ablauf gedacht, nicht für die langfristige Nutzung. In der Web-API kann ich von meinem Server aus anrufen, um neue Zugangstoken über refresh_token zu erhalten. Ich weiß, dass dies in einem Anrufserver zum Server getan werden muss. Aber ich weiß nicht, wie ich die vom Android Spotify SDK bereitgestellten Informationen verwalten soll, um das refresh_token vom Server zu bekommen. Ich weiß nicht einmal, ob dies über das Spotify SDK erreicht werden kann oder ob ich die gesamte Autorisierung implementieren muss. Ich habe Informationen im Internet gesucht, kann aber keine Informationen zu diesem Thema finden. Hoffe jemand kann helfen.Spotify langfristige Anmeldung mit Android SDK

Antwort

0

Wenn Sie ein Aktualisierungs-Token benötigen (das Token, das vom SDK bereitgestellt wird, dauert eine Stunde und Sie müssen dann ein anderes anfordern), müssen Sie die Web-API zum Abrufen dieses Tokens verwenden. In diesem Fall würden Sie das SDK nicht für einen Teil des Authentifizierungsprozesses verwenden. Technisch gesehen müssen Sie keine Server-Server-Komponente für die Weitergabe des Spotify-Server-Authentifizierungsschritts verwenden. Es ist nur eine bewährte Methode, das Geheimnis in Ihrer App zu verschlüsseln, aber technisch gesehen gibt es nichts, was Sie daran hindern könnte Alle authentication steps AppSpotify Server mit den entsprechenden Web-API-Anrufe.

+0

Mein Problem ist, dass ein anderes Token anfordert kann nicht mit dem Android SDK (oder wenn es getan werden kann, ich weiß nicht, wie) erfolgen. Um ein anderes Token zu erhalten, muss ich die vom SDK bereitgestellte Aktivität verwenden. Ich kann das nicht im Hintergrund tun, was mein Ziel ist. Meine aktuelle Lösung verwendet das SDK für auth überhaupt nicht und implementiert es über die Web-API. –

+0

Sie können ein neues Token erhalten, ja durch ihre Aktivität oder Webview. Es ist der gleiche Aktionsabsichts-Aufruf, der auf ihrer Seite (Web-Ansicht-Aktivität oder ihre Apps-Aktivität) nur davon abhängt, ob die Spotify-App auf dem Gerät installiert ist. Es sollte jedoch kein Problem bei der Verwendung ihrer Absicht/Aktivität auftreten. Wenn Sie sich nach dem Zwischenspeichern der Anmeldeinformationen angemeldet haben, wird dem Benutzer die Anmeldeaktivität nicht mehr angezeigt. Nur ein Spinner für eine halbe Sekunde und dann bekommst du ein neues Token. Keine zusätzlichen Eingabeaufforderungen, solange Sie keine zusätzlichen Berechtigungen anfordern als beim vorherigen Anmeldeanruf. –

+0

Dies funktioniert, wenn der Benutzer seinen Bildschirm eingeschaltet hat. Ich habe versucht, die Aktivität im Hintergrund aufzurufen und es funktioniert nicht für mich. –

1

Vor ein paar Monaten habe ich eine App entwickelt, die auch Spotifys Dienste nutzt. Da ich Audiomerkmale eines Liedes abfragen wollte, musste ich die Spotify Web API verwenden, da Spotifys Android SDK solche Dinge noch nicht bereitgestellt hat. Als ich die App implementiert habe, habe ich nicht zu viel darüber nachgedacht, sodass ich jedes Mal, wenn ich Abfragen ausführen muss, wieder Zugriff auf das Token bekommen würde. Sie können das Token mit dem folgenden Code erhalten, innerhalb der JSON-Zeichenfolge kommt auch mit einer expenses_in-Eigenschaft, die Ihnen sagt, wie viele Sekunden das Token abläuft, daher sollte es leicht sein, was Sie wollen, mit einer leichten Änderung zu erreichen.

private String getAccessTokenFromJsonStr(String spotifyJsonStr) throws JSONException { 
    final String OWM_ACCESS_TOKEN = "access_token"; 
    String accessToken; 

    try { 
     JSONObject spotifyJson = new JSONObject(spotifyJsonStr); 
     accessToken = spotifyJson.getString(OWM_ACCESS_TOKEN); 
    } catch (JSONException e) { 
     Log.e(LOG_TAG, e.getMessage(), e); 
     e.printStackTrace(); 
    } 

    return accessToken; 
} 

private String getSpotifyAccessToken(){ 
    String response; 
    String accessToken; 
    try { 
     String serviceURL = "https://accounts.spotify.com/api/token"; 
     URL myURL = new URL(serviceURL); 

     HttpsURLConnection myURLConnection = (HttpsURLConnection) myURL.openConnection(); 

     String userCredentials = "YOUR_USER_CREDENTIALS:YOUR_USER_CREDENTIALS"; 
     int flags = Base64.NO_WRAP | Base64.URL_SAFE; 
     byte[] encodedString = Base64.encode(userCredentials.getBytes(), flags); 
     String basicAuth = "Basic " + new String(encodedString); 
     myURLConnection.setRequestProperty("Authorization", basicAuth); 

     myURLConnection.setRequestMethod("POST"); 
     myURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     myURLConnection.setUseCaches(false); 
     myURLConnection.setDoInput(true); 
     myURLConnection.setDoOutput(true); 
     System.setProperty("http.agent", ""); 

     HashMap postDataParams = new HashMap<String, String>(); 
     postDataParams.put("grant_type", "client_credentials"); 
     OutputStream os = myURLConnection.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(
       new OutputStreamWriter(os, "UTF-8")); 
     writer.write(getPostDataString(postDataParams)); 

     writer.flush(); 
     writer.close(); 
     os.close(); 

     response = ""; 
     int responseCode=myURLConnection.getResponseCode(); 

     Log.d(LOG_TAG, "response code is " + responseCode); 

     if (responseCode == HttpsURLConnection.HTTP_OK) { 
      String line; 
      BufferedReader br=new BufferedReader(new InputStreamReader(myURLConnection.getInputStream())); 
      while ((line=br.readLine()) != null) { 
       response+=line; 
      } 
     } 
     else { 
      response=""; 
      String errLine; 
      String errResponse = ""; 
      BufferedReader br=new BufferedReader(new InputStreamReader(myURLConnection.getErrorStream())); 
      while ((errLine=br.readLine()) != null) { 
       errResponse += errLine; 
      } 
      Log.d(LOG_TAG, "error response is " + errResponse); 

     } 

     Log.d(LOG_TAG, "response is " + response); 


    } catch (Exception e){ 
     e.printStackTrace(); 
    } 

    String accessTokenJsonStr = response.toString(); 
    try { 
     accessToken = getAccessTokenFromJsonStr(accessTokenJsonStr); 
     return accessToken; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return ""; 
} 

Authorization-guide

Verwandte Themen