【发布时间】:2022-11-15 14:25:12
【问题描述】:
我正在使用 retrofit2 尝试连接到 Spotify。现在我只是记录结果代码以查看它是否有效。当我从我的 api 调用中删除“授权”标头/参数时,它给我一个 401 错误,表明我没有被授权。当我添加授权参数并传递访问令牌时,它给我 404 错误,指示“未找到”。我对这些东西没有经验,但这让我感到困惑,请发送想法/建议。
import static com.example.spotifyapp1.spotifyconstants.Constants.CLIENT_ID;
import static com.example.spotifyapp1.spotifyconstants.Constants.REDIRECT_URI;
import static com.example.spotifyapp1.spotifyconstants.Constants.REQUEST_CODE;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import com.example.spotifyapp1.data.RetrofitInstance;
import com.example.spotifyapp1.data.SpotifyApi;
import com.example.spotifyapp1.databinding.ActivityMainBinding;
import com.spotify.sdk.android.auth.AuthorizationClient;
import com.spotify.sdk.android.auth.AuthorizationRequest;
import com.spotify.sdk.android.auth.AuthorizationResponse;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
Retrofit retrofit = RetrofitInstance.getRetrofitInstance();
SpotifyApi spotifyApi = retrofit.create(SpotifyApi.class);
Call<Response<String>> mainCall;
String accessToken;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
AuthorizationRequest.Builder builder = new AuthorizationRequest.Builder(CLIENT_ID, AuthorizationResponse.Type.TOKEN, REDIRECT_URI);
AuthorizationRequest request = builder.setScopes(new String[]{"app-remote-control","streaming"}).build();
AuthorizationClient.openLoginActivity(this,REQUEST_CODE,request);
binding.setVolumeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mainCall.enqueue(
new Callback<Response<String>>() {
@Override
public void onResponse(Call<Response<String>> call, Response<Response<String>> response) {
//Log.d("MainActivity",String.format("tokenAtCall:%s",accessToken));
Log.d("MainActivity", String.format("onResponse: code..%d",response.code()));
}
@Override
public void onFailure(Call<Response<String>> call, Throwable t) {
Log.d("MainActivity", "onFailure");
}
}
);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode,resultCode,intent);
if (requestCode == REQUEST_CODE) {
AuthorizationResponse response = AuthorizationClient.getResponse(resultCode,intent);
switch (response.getType()) {
case TOKEN:
//Log.d("MainActivity", "token");
accessToken = response.getAccessToken();
//Log.d("MainActivity",String.format("token:%s",accessToken));
mainCall = spotifyApi.setVolume("Bearer " + accessToken,50,null);
case ERROR:
//Log.d("MainActivity", "error");
default:
//Log.d("MainActivity", "default");
}
}
}
}
在这里,我使用 spotify.android:auth 库对 spotify 进行身份验证。身份验证似乎有效,因为它为我提供了一个访问令牌,然后我尝试将其传递到呼叫中,但未成功。
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.http.Header;
import retrofit2.http.PUT;
import retrofit2.http.Query;
public interface SpotifyApi {
@PUT("/me/player/volume")
Call<Response<String>> setVolume(
@Header("Authorization") String authorization,
@Query("volume_percent") int volumePercent,
@Query("device_id") String deviceId
);
}
这是我的 api
import static com.example.spotifyapp1.spotifyconstants.Constants.BASE_URL;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class RetrofitInstance {
public static Retrofit getRetrofitInstance() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
return retrofit;
}
}
和我的改造
【问题讨论】:
标签: java retrofit retrofit2 spotify