Sinch не запускается - PullRequest
       36

Sinch не запускается

0 голосов
/ 17 апреля 2020

Это такая базовая c проблема, что я не уверен, что могу ошибаться. Синч не начинается для меня, и я не знаю почему. У меня недостаточно опыта работы с Sinch, чтобы диагностировать, почему команда basi c не выполняет то, что должна делать. Вот что у меня есть:

Я пытаюсь начать и сделать вызов из класса Calling. java. Код выглядит следующим образом:

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.sinch.android.rtc.calling.Call;
import com.squareup.picasso.Picasso;

import static android.content.Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP;

public class Calling extends CallActivity {
    private String calleeID;
    private TextView serviceName;
    Bundle callDetails;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calling);
        callDetails = getIntent().getBundleExtra("callDetails");

        //Setup end button
        Button endCallButton = findViewById(R.id.endcall);
        endCallButton.setOnClickListener(v -> endCall());
    }

    private void endCall() {
        if (getSinchServiceInterface() != null) {
            getSinchServiceInterface().stopClient();
        }
        finishActivity(FLAG_ACTIVITY_PREVIOUS_IS_TOP);
        finish();
    }

    // invoked when the connection with SinchServer is established
    @Override
    protected void onServiceConnected() {
        //Setup Calling Screen
        ImageView avatar = findViewById(R.id.dialingAvatar);
        Picasso.get().load(callDetails.getString("Logo")).into(avatar);
        TextView midScreenName = findViewById(R.id.memberName);
        midScreenName.setText(callDetails.getString("Name"));
        serviceName = findViewById(R.id.serviceName);
        serviceName.setText(callDetails.getString("Service"));
        TextView ratings = findViewById(R.id.rating);
        ratings.setText(callDetails.getString("Rating") + " ★");


        //Get CallerID and CalleeID
        calleeID = callDetails.getString("CalleeID");

        //Start sinch Service
        if(!getSinchServiceInterface().isStarted()){
            getSinchServiceInterface().startClient(callDetails.getString("CallerID"));
            Call call = getSinchServiceInterface().callUserVideo(calleeID);
            Intent callServiceScreen = new Intent(this, ServiceCallActivity.class);
            callDetails.putString(SinchService.CALL_ID, call.getCallId());
            callServiceScreen.putExtra("Call Details", callDetails);
            startActivity(callServiceScreen);
        }
    }

    @Override
    public void onDestroy() {
        if (getSinchServiceInterface() != null) {
            getSinchServiceInterface().stopClient();
        }
        super.onDestroy();
    }

}

Я иду на вызов. java от Precall. java код для этого:

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.sinch.android.rtc.SinchError;
import com.squareup.picasso.Picasso;

import org.json.JSONObject;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class precall extends CallActivity implements SinchService.StartFailedListener {

    private Bundle memberDetails;
    private String url;
    private Button cancel;
    private Button call;

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

        //url
        url = apiCallPoints.userInfo;

        //Set Member Text
        memberDetails = getIntent().getBundleExtra("Member");

        //Populate screen
        ImageView avatar = findViewById(R.id.avatar);
        Picasso.get().load(memberDetails.getString("Logo")).into(avatar);
        TextView memberName = findViewById(R.id.membername);
        memberName.setText(memberDetails.getString("Name"));
        TextView rating = findViewById(R.id.rating);
        rating.setText(memberDetails.getString("Rating")  + " ★");
        TextView serviceName = findViewById(R.id.servicename);
        serviceName.setText(memberDetails.getString("Service"));
        TextView overview = findViewById(R.id.overview);
        overview.setText(memberDetails.getString("Overview"));

        //Add button clicks
        cancel = findViewById(R.id.cancel_button);
        cancel.setOnClickListener(view -> finish());
        cancel.setEnabled(false);
        call = findViewById(R.id.yes_button);
        call.setOnClickListener(view -> {
            goToCalling();
        });
        call.setEnabled(false);
        setHomeBar();
    }

    //this method is invoked when the connection is established with the SinchService
    @Override
    protected void onServiceConnected() {
        call.setEnabled(true);
        cancel.setEnabled(true);
        getSinchServiceInterface().setStartListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    public void onStartFailed(SinchError error) {

    }

    //Invoked when just after the service is connected with Sinch
    @Override
    public void onStarted() {
    }

    private void goToCalling() {
        //Async search
        CallBackendSync callBackendSync = new CallBackendSync();
        Object [] params = {url, memberDetails};
        callBackendSync.execute(params);
    }

    private void setHomeBar() {
        final Button home = findViewById(R.id.home_button);
        home.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Code here executes on main thread after user presses button
                startActivity(new Intent(precall.this, SecondActivity.class));
            }
        });

        final Button favourites = findViewById(R.id.star_button);
        favourites.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Code here executes on main thread after user presses button
                startActivity(new Intent(precall.this, Favourite_Page.class));
            }
        });

        final Button profile_page = findViewById(R.id.person_button);
        profile_page.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Code here executes on main thread after user presses button
                startActivity(new Intent(getApplicationContext(), Profile.class));
            }
        });

        final Button notifications = findViewById(R.id.notification_button);
        notifications.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Code here executes on main thread after user presses button
                startActivity(new Intent(precall.this, Notification_Page.class));
            }
        });

        final Button service = findViewById(R.id.service_button);
        service.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Code here executes on main thread after user presses button

                startActivity(new Intent(precall.this, services.class));
            }
        });
    }

    class CallBackendSync extends AsyncTask {

        OkHttpClient client = new OkHttpClient();

        @Override
        protected Object doInBackground(Object [] objects) {
            String url = (String) objects[0];
            Bundle memberDetails = (Bundle) objects[1];

            //Get access token from shared preference
            isLoggedIn loggedIn = new isLoggedIn(getApplicationContext());
            String token = loggedIn.getToken();

            if(token != null){
                //Create request
                Request request = new Request.Builder()
                        .url(url)
                        .addHeader("Authorization", "Bearer " + token)
                        .addHeader("Accept", "application/json")
                        .build();

                try {
                    Response response = client.newCall(request).execute();
                    JSONObject results = new JSONObject(response.body().string());
                    String UserID = results.getString("UserId");
                    memberDetails.putString("CallerID", UserID);
                    Intent callIntent = new Intent(precall.this, Calling.class);
                    callIntent.putExtra("callDetails", memberDetails);
                    startActivity(callIntent);
                    return results;
                }catch (Exception e){
                    e.printStackTrace();
                }
            } else {
                startActivity(new Intent(precall.this, Login_page.class));
            }
            return null;
        }

        protected void onPostExecute(String s){
            super.onPostExecute(s);
        }
    }
}

Ошибка происходит в SinchService. java

import com.sinch.android.rtc.AudioController;
import com.sinch.android.rtc.ClientRegistration;
import com.sinch.android.rtc.Sinch;
import com.sinch.android.rtc.SinchClient;
import com.sinch.android.rtc.SinchClientListener;
import com.sinch.android.rtc.SinchError;
import com.sinch.android.rtc.video.VideoController;
import com.sinch.android.rtc.calling.Call;
import com.sinch.android.rtc.calling.CallClient;
import com.sinch.android.rtc.calling.CallClientListener;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class SinchService extends Service {

    private static final String APP_KEY = "is correct";
    private static final String APP_SECRET = "is correct";
    //private static final String ENVIRONMENT = "clientapi.sinch.com";
    private static final String ENVIRONMENT = "sandbox.sinch.com";

    public static final String CALL_ID = "CALL_ID";
    static final String TAG = SinchService.class.getSimpleName();

    private SinchServiceInterface mSinchServiceInterface = new SinchServiceInterface();
    private SinchClient mSinchClient = null;
    private String mUserId = "";

    private StartFailedListener mListener;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        if(mSinchClient != null){
            mSinchClient.terminate();
        }
        super.onDestroy();
    }

    private void start(String userName) {
        mUserId = userName;
        mSinchClient = Sinch.getSinchClientBuilder().context(getApplicationContext())
                .applicationKey(APP_KEY)
                .applicationSecret(APP_SECRET)
                .environmentHost(ENVIRONMENT)
                .userId(userName)
                .enableVideoCalls(true)
                .build();
        mSinchClient.setSupportCalling(true);
        mSinchClient.startListeningOnActiveConnection();
        mSinchClient.addSinchClientListener(new MySinchClientListener());
        mSinchClient.getCallClient().addCallClientListener(new SinchCallClientListener());
        mSinchClient.checkManifest();
        mSinchClient.start();
        System.out.println("Is started: " + mSinchClient.isStarted());
    }

    private void stop() {
        if(mSinchClient != null){
            mSinchClient.terminate();
        }
    }

    private boolean isStarted() {
        if(mSinchClient != null){
            return mSinchClient.isStarted();
        } else {
            return false;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mSinchServiceInterface;
    }

    public class SinchServiceInterface extends Binder {

        public Call callUserVideo(String userId) {
            return mSinchClient.getCallClient().callUserVideo(userId);
        }

        public String getUserName() {
            return mUserId;
        }

        public boolean isStarted() {
            return SinchService.this.isStarted();
        }

        public void startClient(String userName) {
            start(userName);
        }

        public void stopClient() {
            stop();
        }

        public void setStartListener(StartFailedListener listener) {
            mListener = listener;
        }

        public Call getCall(String callId) {
            return mSinchClient.getCallClient().getCall(callId);
        }

        public VideoController getVideoController() {
            return mSinchClient.getVideoController();
        }

        public AudioController getAudioController() {
            return mSinchClient.getAudioController();
        }
    }

    public interface StartFailedListener {

        void onStartFailed(SinchError error);

        void onStarted();
    }

    private class MySinchClientListener implements SinchClientListener {

        @Override
        public void onClientFailed(SinchClient client, SinchError error) {
            if (mListener != null) {
                mListener.onStartFailed(error);
            }
            mSinchClient.terminate();
            mSinchClient = null;
        }

        @Override
        public void onClientStarted(SinchClient client) {
            Log.d(TAG, "SinchClient started");
            if (mListener != null) {
                mListener.onStarted();
            }
        }

        @Override
        public void onClientStopped(SinchClient client) {
            Log.d(TAG, "SinchClient stopped");
        }

        @Override
        public void onLogMessage(int level, String area, String message) {
            switch (level) {
                case Log.DEBUG:
                    Log.d(area, message);
                    break;
                case Log.ERROR:
                    Log.e(area, message);
                    break;
                case Log.INFO:
                    Log.i(area, message);
                    break;
                case Log.VERBOSE:
                    Log.v(area, message);
                    break;
                case Log.WARN:
                    Log.w(area, message);
                    break;
            }
        }

        @Override
        public void onRegistrationCredentialsRequired(SinchClient client,
                                                      ClientRegistration clientRegistration) {
        }
    }

    private class SinchCallClientListener implements CallClientListener {

        @Override
        public void onIncomingCall(CallClient callClient, Call call) {
            Log.d(TAG, "Incoming call");
            Intent intent = new Intent(SinchService.this, Calling.class);
            intent.putExtra(CALL_ID, call.getCallId());
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            SinchService.this.startActivity(intent);
        }
    }

}

А основной деятельностью является CallActivity. java

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.sinch.android.rtc.calling.Call;
import com.squareup.picasso.Picasso;

import static android.content.Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP;

public class Calling extends CallActivity {
    private String calleeID;
    private TextView serviceName;
    Bundle callDetails;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calling);
        callDetails = getIntent().getBundleExtra("callDetails");

        //Setup end button
        Button endCallButton = findViewById(R.id.endcall);
        endCallButton.setOnClickListener(v -> endCall());
    }

    private void endCall() {
        if (getSinchServiceInterface() != null) {
            getSinchServiceInterface().stopClient();
        }
        finishActivity(FLAG_ACTIVITY_PREVIOUS_IS_TOP);
        finish();
    }

    // invoked when the connection with SinchServer is established
    @Override
    protected void onServiceConnected() {
        //Setup Calling Screen
        ImageView avatar = findViewById(R.id.dialingAvatar);
        Picasso.get().load(callDetails.getString("Logo")).into(avatar);
        TextView midScreenName = findViewById(R.id.memberName);
        midScreenName.setText(callDetails.getString("Name"));
        serviceName = findViewById(R.id.serviceName);
        serviceName.setText(callDetails.getString("Service"));
        TextView ratings = findViewById(R.id.rating);
        ratings.setText(callDetails.getString("Rating") + " ★");


        //Get CallerID and CalleeID
        calleeID = callDetails.getString("CalleeID");

        //Start sinch Service
        if(!getSinchServiceInterface().isStarted()){
            getSinchServiceInterface().startClient(callDetails.getString("CallerID"));
            Call call = getSinchServiceInterface().callUserVideo(calleeID);
            Intent callServiceScreen = new Intent(this, ServiceCallActivity.class);
            callDetails.putString(SinchService.CALL_ID, call.getCallId());
            callServiceScreen.putExtra("Call Details", callDetails);
            startActivity(callServiceScreen);
        }
    }

    @Override
    public void onDestroy() {
        if (getSinchServiceInterface() != null) {
            getSinchServiceInterface().stopClient();
        }
        super.onDestroy();
    }

}

Я бился головой об этом, но не могу понять, в чем дело. Я уверен, что это что-то глупое и очевидное, что я не вижу, потому что я слишком близок к коду. Но любые идеи, которые у вас есть, ребята, были бы очень полезны!

1 Ответ

0 голосов
/ 17 апреля 2020

Похоже, вы не дожидаетесь его запуска, прежде чем попытаться позвонить. Мы рекомендуем запустить сервис при запуске приложения. Если вы этого не сделаете, вам нужно подождать или событие onStarted в службе для огня

...