Проблема с кодом авторизации. Android Studio Java, подключение к API на Python

Рейтинг: -2Ответов: 1Опубликовано: 22.06.2023

Пишу приложение-трекер для самолетов, в приложении должна быть авторизация, написал такой код:

package com.example.planetracler;

import static com.tinder.scarlet.websocket.okhttp.OkHttpClientUtils.newWebSocketFactory;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ProcessLifecycleOwner;
import androidx.lifecycle.ViewModelProvider;

import com.example.Clases.LoginRequest;
import com.example.Clases.LoginResponse;
import com.example.Clases.LoginViewModel;
import com.example.Interface.WebSocketService;
import com.tinder.scarlet.Scarlet;
import com.tinder.scarlet.messageadapter.gson.GsonMessageAdapter;
import com.tinder.scarlet.streamadapter.rxjava2.RxJava2StreamAdapterFactory;

import java.security.cert.CertificateException;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import okhttp3.OkHttpClient;

public class MainActivity extends AppCompatActivity {
    private LoginViewModel loginViewModel;
    private WebSocketService webSocketService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Setup ViewModel
        loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);
        setupObservers();

        // Setup SSL for self-signed certificate
        SSLContext sslContext;
        TrustManager[] trustAllCerts = new TrustManager[] {
                new X509TrustManager() {
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[] {};
                    }
                    public void checkClientTrusted(
                            java.security.cert.X509Certificate[] certs, String authType) throws CertificateException {
                    }
                    public void checkServerTrusted(
                            java.security.cert.X509Certificate[] certs, String authType) throws CertificateException {
                    }
                }
        };

        try {
            sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .sslSocketFactory(sslContext.getSocketFactory())
                    .hostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    }).build();

            Scarlet scarlet = new Scarlet.Builder()
                    .webSocketFactory(newWebSocketFactory(okHttpClient, "wss://10.0.2.2:8765"))
                    .addMessageAdapterFactory(new GsonMessageAdapter.Factory())
                    .addStreamAdapterFactory(new RxJava2StreamAdapterFactory())
                    .lifecycle(ProcessLifecycleOwner.get().getLifecycle())
                    .build();


            webSocketService = scarlet.create(WebSocketService.class);

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

        final EditText usernameEditText = findViewById(R.id.input_login);
        final EditText passwordEditText = findViewById(R.id.input_password);
        final AppCompatButton loginButton = findViewById(R.id.login_btn);

        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginRequest.LoginData loginData = new LoginRequest.LoginData();
                loginData.username = usernameEditText.getText().toString();
                loginData.password = passwordEditText.getText().toString();

                LoginRequest loginRequest = new LoginRequest();
                loginRequest.action = "login";
                loginRequest.data = loginData;

                webSocketService.sendLogin(loginRequest);
            }
        });
    }

    private void setupObservers() {
        loginViewModel.getLoginResponse().observe(this, new Observer<LoginResponse>() {
            @Override
            public void onChanged(LoginResponse loginResponse) {
                if (loginResponse.status.equals("success")) {
                    Toast.makeText(MainActivity.this, "Login Successful!", Toast.LENGTH_SHORT).show();
                    // Handle successful login
                } else {
                    Toast.makeText(MainActivity.this, "Login Failed!", Toast.LENGTH_SHORT).show();
                    // Handle unsuccessful login
                }
            }
        });
    }
}

Но получаю ошибку в 77 строке:

            Scarlet scarlet = new Scarlet.Builder()
                    .webSocketFactory(newWebSocketFactory(okHttpClient, "wss://10.0.2.2:8765"))
                    .addMessageAdapterFactory(new GsonMessageAdapter.Factory())
                    .addStreamAdapterFactory(new RxJava2StreamAdapterFactory())
                    .lifecycle(ProcessLifecycleOwner.get().getLifecycle())
                    .build();

Вот ошибка:

addMessageAdapterFactory(com.tinder.scarlet.MessageAdapter.Factory) in
com.tinder.scarlet.Scarlet.Builder cannot be applied to 
(com.tinder.scarlet.messageadapter.gson.GsonMessageAdapter.Factory).

Уже все перепробовал, может, кто сталкивался?

Ответы

▲ 0

Вы передаете параметр другого типа. Метод addMessageAdapterFactory(MessageAdapter.Factory) принимает объект класса MessageAdapter.Factory. А вы пытаетесь передать ему объект класса GsonMessageAdapter.Factory.

Давайте разберем простыми типами, например создадим метод:

public static void exampleMethod(Integer num) {
    System.out.println(num);
}

Метод exampleMethod принимает один параметр типа Integer.

public static void main(String[] args) {
    exampleMethod("Hello world!");
}

При вызове exampleMethod у вас будет идентичная ошибка. Мы будем пытаться сохранить значение "Hello world!" в переменную типа Integer.

И так. Вам что бы исправить вашу ошибку, нужно передать в метод addMessageAdapterFactory(MessageAdapter.Factory) объект класса MessageAdapter.Factory или объект наследуемого от этого класса.