2016-11-14 110 views
3

我想在Android中使用sinch音頻和視頻呼叫,但問題是如何檢查來電是音頻還是視頻。我正在使用共享首選項。視頻到視頻通話在雙方都能正常工作,並且當來電是另一端的視頻來電呼叫活動而不是其他用戶電話的音頻時,雙方都能正常工作。任何幫助,將不勝感激。在Android中Sinch音頻和視頻呼叫

公共類SinchService延伸服務{

//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(); 


      } 
    } 
} 

}

回答

0

你不能那樣做,如果它的視頻通話,你需要回答的視頻,如果它的一個聲音叫你需要回答它就像一個音頻,接收者不能決定。在GA版本中,我們將有可能無法打開視頻,但只是在視頻通話時播放音頻

+0

sinch service如何決定傳入呼叫是音頻還是視頻自動啓動該活動。任何方案! –

+0

如果你關注視頻,你可以擁有相同的視角,想象的是視頻流中的音頻是視頻流中的核心,這就是爲什麼當你不聽添加視頻軌道時它不工作。您還可以檢查來電的通話詳細信息,如果它有視頻 – cjensen

+0

謝謝,但我用單獨的按鈕進行音頻和視頻通話不使用一個按鈕來執行這兩個操作。 –

0

我使用以下代碼同時進行了音頻和視頻通話。 In SinchService

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); 
     } 
    } 
} 
+0

我已經試過但沒有工作。但是,感謝您的幫助。 –

+0

您是否爲音頻和視頻使用單獨的Sinch服務類別? –

+0

不,我只用音頻和視頻服務。 –