【问题标题】:Sinch Audio and Video Calling in AndroidAndroid 中的 Sinch 音视频通话
【发布时间】:2019-12-23 19:26:19
【问题描述】:

我正在尝试在 android 中使用 sinch 音频和视频通话,但问题是如何检查来电是音频还是视频。我为此目的使用共享首选项。视频到视频通话在双方都可以正常工作,并且当来电是另一侧的音频时,视频来电活动被称为而不是其他用户电话中的音频。任何帮助将不胜感激。

public class SinchService extends Service {

    //set the shared preferences
    private SharedPreferences mPickSharedPrefs;
    private SharedPreferences.Editor mPickSharedPrefsEditor;

    private static final String APP_KEY = "*******************";
    private static final String APP_SECRET = "****************";
    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;
    private String mUserId;

    private StartFailedListener mListener;

    @Override
    public void onCreate() {


        super.onCreate();
        mPickSharedPrefs = getSharedPreferences("mPickSharedPrefs", Context.MODE_PRIVATE);
        mPickSharedPrefsEditor=mPickSharedPrefs.edit();


    }

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

    private void start(String userName) {
        if (mSinchClient == null) {
            mUserId = userName;
            mSinchClient = Sinch.getSinchClientBuilder().context(getApplicationContext()).userId(userName)
                    .applicationKey(APP_KEY)
                    .applicationSecret(APP_SECRET)
                    .environmentHost(ENVIRONMENT).build();

            mSinchClient.setSupportCalling(true);
            mSinchClient.startListeningOnActiveConnection();

            mSinchClient.addSinchClientListener(new MySinchClientListener());
            // Permission READ_PHONE_STATE is needed to respect native calls.
            mSinchClient.getCallClient().setRespectNativeCalls(false);
            mSinchClient.getCallClient().addCallClientListener(new SinchCallClientListener());
            mSinchClient.start();
        }
    }

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

    private boolean isStarted() {
        return (mSinchClient != null && mSinchClient.isStarted());
    }

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

    public class SinchServiceInterface extends Binder {

        public Call callUserVideo(String userId) {
          //  mPickSharedPrefsEditor=mPickSharedPrefs.edit();
            mPickSharedPrefsEditor.putString("call_status","1");
            mPickSharedPrefsEditor.commit();
            return mSinchClient.getCallClient().callUserVideo(userId);
        }

        public Call callPhoneNumber(String phoneNumber) {
            return mSinchClient.getCallClient().callPhoneNumber(phoneNumber);
        }

        public Call callUser(String userId) {
          //  mPickSharedPrefsEditor=mPickSharedPrefs.edit();
            mPickSharedPrefsEditor.putString("call_status","0");
            mPickSharedPrefsEditor.commit();
            return mSinchClient.getCallClient().callUser(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() {
            if (!isStarted()) {
                return null;
            }
            return mSinchClient.getVideoController();
        }

        public AudioController getAudioController() {
            if (!isStarted()) {
                return null;
            }
            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");
            Log.d(TAG,call.getRemoteUserId());

            mPickSharedPrefs=getSharedPreferences("mPickSharedPrefs", Context.MODE_PRIVATE);
            mPickSharedPrefsEditor=mPickSharedPrefs.edit();
            String Check_Call_Status;
            Check_Call_Status=mPickSharedPrefs.getString("call_status","");
            Log.d(TAG,Check_Call_Status);
            if(Check_Call_Status.equals("1")) {

                Log.d(TAG,"Video Call");
                Intent intent = new Intent(SinchService.this, IncomingCallScreenActivity.class);
                intent.putExtra(CALL_ID, call.getCallId());
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                SinchService.this.startActivity(intent);
                mPickSharedPrefsEditor.clear();
            }
            else
                if(Check_Call_Status.equals("0"))
                {
                    Log.d(TAG,"Voice Call");

                    Intent intent = new Intent(SinchService.this, VoiceIncomingCallScreenActivity.class);
                    intent.putExtra(CALL_ID, call.getCallId());
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    SinchService.this.startActivity(intent);
                    mPickSharedPrefsEditor.clear();


                }
        }
    }

}

【问题讨论】:

    标签: android sinch android-sinch-api


    【解决方案1】:

    我使用下面的代码同时进行了音频和视频通话。 在新奇服务中

    private class SinchCallClientListener implements CallClientListener {
    
        @Override
        public void onIncomingCall(CallClient callClient, Call call) {
    
            if (call.getDetails().isVideoOffered()) {
                Log.d(TAG, "Incoming video call");
                Intent intent = new Intent(SinchService.this, VideoIncomingCallScreenActivity.class);
                intent.putExtra(CALL_ID, call.getCallId());
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                SinchService.this.startActivity(intent);
            } else {
                Log.d(TAG, "Incoming audio call");
                Intent intent = new Intent(SinchService.this, IncomingCallScreenActivity.class);
                intent.putExtra(CALL_ID, call.getCallId());
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                SinchService.this.startActivity(intent);
            }
        }
    }
    

    【讨论】:

    • 我已经尝试过了,但没有成功。不过感谢您的帮助。
    • 您是否为音频和视频使用了单独的 Sinch 服务类?
    • 您是否在 Sinch Service 类中使用了 public Call callUserVideo(String userId) {}、public VideoController getVideoController() {} 和 public AudioController getAudioController() {} 方法。
    • 我认为没有使用 getVideoController 和 AudioController 但我使用 callUserVideo 功能
    • 您必须在 sinch 服务中使用这些方法才能在您的应用中启用视频和音频通话。
    【解决方案2】:

    您不能那样做,如果是视频通话,您需要接听视频,如果是音频通话,您需要像音频一样接听,收件人无法决定。在 GA 版本中,我们将有可能在您进行视频通话时不打开视频,而只打开音频

    【讨论】:

    • sinch 服务如何决定来电是音频还是视频自动启动该活动。任何解决方案!
    • 如果您处理视频,您也可以使用相同的方法,认为当它是一个视频时,音频在视频流中不断变化,这就是为什么当您不收听添加视频时它不起作用的原因追踪。如果有视频,您还可以查看来电的通话详细信息
    • 谢谢,但我使用单独的按钮进行音频和视频通话,而不是使用一个按钮来执行这两个操作。
    • 你仍然可以这样做,但是在来电时你需要检查通话类型而不是 tham pref 是否有 calee
    • 好的。我会检查我是否有任何疑问,而不是再次问你。谢谢
    【解决方案3】:

    您可以使用检查

    call.getDetails().isVideoOffered()

    在 onIncomingCall(){} 函数中。如果它返回 true,则表示它是视频通话,否则是音频。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多