Пример Android-приложения для аудиозвонков
Поля ввода, необходимые для установления SIP-соединения
...
В поле 'Callee' вводится SIP имя пользователя вызываемого.
При нажатии на кнопку Connect/Disconnect устанавливается/закрывается SIP-соединение.
При нажатии на кнопку Call/Hangup делается/завершается звонок.
Кнопка Hold/Unhold используется для удержания/снятия с удержания звонка.
Работа с кодом примера
Для разбора кода возьмем класс PhoneMinActivity.java примера phone-min, который доступен для скачивания в соответствующей сборке 1.0.1.38.
...
Code Block | ||||
---|---|---|---|---|
| ||||
mCallButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if (mCallButton.getTag() == null || Integer.valueOf(R.string.action_call).equals(mCallButton.getTag())) { if ("".equals(mCalleeView.getText().toString())) { return; } ActivityCompat.requestPermissions(PhoneMinActivity.this, new String[]{Manifest.permission.RECORD_AUDIO}, CALL_REQUEST_CODE); SharedPreferences sharedPref = PhoneMinActivity.this.getPreferences(Context.MODE_PRIVATE); } SharedPreferences.Editor editor = sharedPref.edit();else { editormCallButton.putString("callee", mCalleeView.getText().toString())setEnabled(false); editorcall.applyhangup(); } else { mCallButton.setEnabled(false); call.hangup(); call = null; } View currentFocus = getCurrentFocus(); if (currentFocus != null) { InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } }); |
...
Code Block | ||||
---|---|---|---|---|
| ||||
case CALL_REQUEST_CODE: { if (grantResults.length == 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) { Log.i(TAG, "Permission has been denied by user"); } else { mCallButton.setEnabled(false); /** * Get call options from the callee text field */ CallOptions callOptions = new CallOptions(mCalleeView.getText().toString()); AudioConstraints audioConstraints = callOptions.getConstraints().getAudioConstraints(); MediaConstraints mediaConstraints = audioConstraints.getMediaConstraints(); mediaConstraints..optional.add( new MediaConstraints.KeyValuePair("googEchoCancellation", Boolean.toString(googEchoCancellation.isChecked()))); mediaConstraints.optional.add( new MediaConstraints.KeyValuePair("googAutoGainControl", Boolean.toString(googAutoGainControl.isChecked()))); mediaConstraints.optional.add( new MediaConstraints.KeyValuePair("googNoiseSupression", Boolean.toString(googNoiseSupression.isChecked()))); mediaConstraints.optional.add( new MediaConstraints.KeyValuePair("googHighpassFilter", Boolean.toString(googHighpassFilter.isChecked()))); mediaConstraints.optional.add( new MediaConstraints.KeyValuePair("googEchoCancellation2", Boolean.toString(googEchoCancellation2.isChecked()))); mediaConstraints.optional.add( new MediaConstraints.KeyValuePair("googAutoGainControl2", Boolean.toString(googAutoGainControl2.isChecked()))); mediaConstraints.optional.add( new MediaConstraints.KeyValuePair("googNoiseSuppression2", Boolean.toString(googNoiseSuppression2.isChecked()))); try { Map<String, String> inviteParameters = new Gson().fromJson(mInviteParametersView.getText().toString(), new TypeToken<Map<String, String>>() { }.getType()); callOptions.setInviteParameters(inviteParameters); } catch (Throwable t) { Log.e(TAG, "Invite Parameters have wrong format of json object"); } call = session.createCall(callOptions); call.on(callStatusEvent); /** * Make the outgoing call */ call.call(); Log.i(TAG, "Permission has been granted by user"); break; } } |
...