Skip to content
Advertisement

Android Studio Retrofit Call Failure

I’m trying to use Retrofit in my app via Java. I’m using this worldtime API. You can call this URL in your browser to see the response : http://worldtimeapi.org/api/timezone/Europe/Istanbul (response comes too late, just refresh your browser)

I added this line to my AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

I added these to gradle

implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

I only want to see few keys of response, so I created a class TimeForIstanbul.java

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class TimeForIstanbul {
    @SerializedName("day_of_week")
    @Expose
    public Integer dayOfWeek;
    @SerializedName("utc_datetime")
    @Expose
    public String utcDatetime;
    @SerializedName("week_number")
    @Expose
    public Integer weekNumber;

    public Integer getDayOfWeek() {
        return dayOfWeek;
    }

    public void setDayOfWeek(Integer dayOfWeek) {
        this.dayOfWeek = dayOfWeek;
    }

    public String getUtcDatetime() {
        return utcDatetime;
    }

    public void setUtcDatetime(String utcDatetime) {
        this.utcDatetime = utcDatetime;
    }

    public Integer getWeekNumber() {
        return weekNumber;
    }

    public void setWeekNumber(Integer weekNumber) {
        this.weekNumber = weekNumber;
    }
}

I created my interface ApiService.java

import retrofit2.Call;
import retrofit2.http.GET;

public interface ApiService {
    @GET("Europe/Istanbul")
    Call<TimeForIstanbul> getTime();
}

And simply I edited my MainActivity.java

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity {

    private Retrofit retrofit;
    private ApiService apiService;
    private String BASE_URL = "http://worldtimeapi.org/api/timezone/";
    private Call<TimeForIstanbul> timeForIstanbulCall;
    private TimeForIstanbul timeForIstanbul;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setRetrofitSettings();
    }
    private void setRetrofitSettings(){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        apiService = retrofit.create(ApiService.class);
        timeForIstanbulCall = apiService.getTime();
        timeForIstanbulCall.enqueue(new Callback<TimeForIstanbul>() {
            @Override
            public void onResponse(Call<TimeForIstanbul> call, Response<TimeForIstanbul> response) {
                if(response.isSuccessful()){
                    timeForIstanbul = response.body();
                    System.out.println(timeForIstanbul.getDayOfWeek());
                }
            }

            @Override
            public void onFailure(Call<TimeForIstanbul> call, Throwable t) {
                System.out.println("Error is ");
                System.out.println(t.toString());
            }
        });
    }
}

And when I run this app, I see

I/System.out: Error is 
    java.net.UnknownServiceException: CLEARTEXT communication to worldtimeapi.org not permitted by network security policy

on logcat so it goes to onFailure. What am I missing? What is wrong here? My resource for this example is this video

Advertisement

Answer

What you have to do to solve the problem is add this on my manifest.xml

android:usesCleartextTraffic="true"

But you may have to use other approaches you can take a look on android-8-cleartext-http-traffic-not-permitted.

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement