Получение java.lang.ClassCastException при отправке тонов DTMF по активному вызову в Android

Я разрабатываю приложение, которое отправляет DTMF-тоны по активному вызову в Android. Я много искал, чтобы реализовать эту функцию в своем приложении, и я нашел это: интерфейс com.android.internal.telecom.IInCallAdapter, который расширяет android.os.IInterface. Внутри IInCallAdapter есть метод playDtmfTone(String s,Char c), который мы можем использовать для отправки тонов DTMF по активному вызову. У меня есть действие HelloPage.java, которое делает это, но получает ошибку java.lang.ClassCastException при инициализации объекта IInCallAdapter. Ну, я знаю, что означает эта ошибка, но не знаю, как с этим бороться. Вот мой код:

public class HelloPage extends Activity implements View.OnClickListener{

Button DTMF_b1,DTMF_b2,DTMF_b3,DTMF_b4,DTMF_b5,DTMF_b6,DTMF_b7,DTMF_b8,DTMF_b9,DTMF_b0,DTMF_bS,DTMF_bP;
private TextView DTMFToneDialedView;
private String DTMFToneDialedNumber = "";
private String callId;
private IInCallAdapter mIInCallAdapter;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_hello_page);

    mIInCallAdapter = (IInCallAdapter) this;   /*I am getting error here in this line*/

    DTMF_b1 = (Button) findViewById(R.id.id_playDTMF1);
    DTMF_b2 = (Button) findViewById(R.id.id_playDTMF2);
    DTMF_b3 = (Button) findViewById(R.id.id_playDTMF3);
    DTMF_b4 = (Button) findViewById(R.id.id_playDTMF4);
    DTMF_b5 = (Button) findViewById(R.id.id_playDTMF5);
    DTMF_b6 = (Button) findViewById(R.id.id_playDTMF6);
    DTMF_b7 = (Button) findViewById(R.id.id_playDTMF7);
    DTMF_b8 = (Button) findViewById(R.id.id_playDTMF8);
    DTMF_b9 = (Button) findViewById(R.id.id_playDTMF9);
    DTMF_bS = (Button) findViewById(R.id.id_playDTMFStar);
    DTMF_b0 = (Button) findViewById(R.id.id_playDTMF0);
    DTMF_bP = (Button) findViewById(R.id.id_playDTMFPound);

    callId = MainActivity.telecomCallId;  //Getting telecom Call ID from a static variable in a MainActivity

    DTMFToneDialedView = (TextView) findViewById(R.id.id_DTMFToneDialedKey);

    DTMF_b1.setOnClickListener(this);
    DTMF_b2.setOnClickListener(this);
    DTMF_b3.setOnClickListener(this);
    DTMF_b4.setOnClickListener(this);
    DTMF_b5.setOnClickListener(this);
    DTMF_b6.setOnClickListener(this);
    DTMF_b7.setOnClickListener(this);
    DTMF_b8.setOnClickListener(this);
    DTMF_b9.setOnClickListener(this);
    DTMF_bS.setOnClickListener(this);
    DTMF_b0.setOnClickListener(this);
    DTMF_bP.setOnClickListener(this);

}

//This method updated the screen what we dial
public void dialedNumberUpdater(String key){

    DTMFToneDialedNumber = DTMFToneDialedNumber + key;
    DTMFToneDialedView.setText(DTMFToneDialedNumber);
}


@Override
public void onClick(View v) {

    switch (v.getId()){

        case R.id.id_playDTMF1:
            try {
                mIInCallAdapter.playDtmfTone(callId, '1');
                dialedNumberUpdater("1");
            }catch (Exception e){
                dialedNumberUpdater("w");  //updating 'w' into the screen so that user can see it is not working.
            }
            break;

        case R.id.id_playDTMF2:
            try {
                mIInCallAdapter.playDtmfTone(callId, '2');
                dialedNumberUpdater("2");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMF3:
            try {
                mIInCallAdapter.playDtmfTone(callId, '3');
                dialedNumberUpdater("3");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMF4:
            try {
                mIInCallAdapter.playDtmfTone(callId, '4');
                dialedNumberUpdater("4");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMF5:
            try {
                mIInCallAdapter.playDtmfTone(callId, '5');
                dialedNumberUpdater("5");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMF6:
            try {
                mIInCallAdapter.playDtmfTone(callId, '6');
                dialedNumberUpdater("6");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMF7:
            try {
                mIInCallAdapter.playDtmfTone(callId, '7');
                dialedNumberUpdater("7");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMF8:
            try {
                mIInCallAdapter.playDtmfTone(callId, '8');
                dialedNumberUpdater("8");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMF9:
            try {
                mIInCallAdapter.playDtmfTone(callId, '9');
                dialedNumberUpdater("9");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMFStar:
            try {
                mIInCallAdapter.playDtmfTone(callId, '*');
                dialedNumberUpdater("*");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMF0:
            try {
                mIInCallAdapter.playDtmfTone(callId, '0');
                dialedNumberUpdater("0");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

        case R.id.id_playDTMFPound:
            try {
                mIInCallAdapter.playDtmfTone(callId, '#');
                dialedNumberUpdater("#");
            }catch (Exception e){
                dialedNumberUpdater("w");
            }
            break;

    }

}

}

Вот Логкат:

01-29 01:43:07.649     565-1247/? I/ActivityManager﹕ START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=algor7.code.backgroundcallingapp/.HelloPage} from uid 10099 on display 0
01-29 01:43:07.794  13439-13439/algor7.code.backgroundcallingapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: algor7.code.backgroundcallingapp, PID: 13439
    java.lang.RuntimeException: Unable to start activity ComponentInfo{algor7.code.backgroundcallingapp/algor7.code.backgroundcallingapp.HelloPage}: java.lang.ClassCastException: algor7.code.backgroundcallingapp.HelloPage cannot be cast to android.os.IInterface
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.ClassCastException: algor7.code.backgroundcallingapp.HelloPage cannot be cast to android.os.IInterface
            at algor7.code.backgroundcallingapp.HelloPage.onCreate(HelloPage.java:39)
            at android.app.Activity.performCreate(Activity.java:6251)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-29 01:43:07.813      565-876/? W/ActivityManager﹕ Force finishing activity algor7.code.backgroundcallingapp/.HelloPage
01-29 01:43:08.345      565-578/? W/ActivityManager﹕ Activity pause timeout for ActivityRecord{454bc33 u0 algor7.code.backgroundcallingapp/.HelloPage t191 f}

Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.


person Algor7    schedule 28.01.2016    source источник
comment
Вы можете увидеть мой проект на Github.   -  person Algor7    schedule 30.01.2016


Ответы (2)


Потому что это объект HelloPage. Это не IInCallAdapter, не наследуется от него и не расширяет его. Это не может быть брошено как один. Почему вы думаете, что это может быть?

person Gabe Sechan    schedule 29.01.2016
comment
Поскольку IInCallAdapter - это интерфейс, который расширяет IInterface, и я думаю, что именно так мы инициализируем обычный объект интерфейса в действии, но это другой тип интерфейса (bcz, он расширяет IInterface)... и этот метод инициализации не работает с этим типом интерфейса .... действительно, я не знаю, как инициализировать этот «mIInCallAdapter». - person Algor7; 29.01.2016
comment
Нет. Способ инициализации интерфейса заключается в создании класса, который его реализует, и создании экземпляра страховки этого класса. Вы не можете использовать действие как единое целое, если оно не реализует его. - person Gabe Sechan; 29.01.2016
comment
Обычно я делаю так. I.java =› public interface I { public void fun(int a); } - person Algor7; 29.01.2016
comment
class ABC extends Activity I {............ @Override void fun(int a) { \\doing something } .......... } - person Algor7; 29.01.2016
comment
класс DEF расширяет Activity { .......... private ABC abc; abc = (ABC) getActivity(); abc.fun(456);.............} - person Algor7; 29.01.2016
comment
Так вы говорите о классе ABC в этом примере, который реализует интерфейс I? - person Algor7; 29.01.2016
comment
Мой HelloPage.java очень похож на DEF.java, как показано в примере выше. - person Algor7; 29.01.2016

Создайте класс, реализующий IInCallAdapter, а затем реализуйте все его методы.

public class ClassName implements IInCallAdapter {
    ... 
} 

Затем вы можете создать экземпляр этого класса в своем классе Activity.

person Gianmarco Reverberi    schedule 29.01.2016
comment
Это основная проблема, класс реализации уже существует, и я ничего об этом не знаю (почти слепой). У меня просто есть этот интерфейс IInCallAdapter, и я хочу его использовать. Я просто знаю, что существует некоторый класс внутренней реализации, который реализует этот интерфейс IInCallAdapter и отправляет тоны DTMF по активному вызову, переопределяя метод playDtmfTone(String s, char c), мне просто нужно использовать этот интерфейс в моей деятельности, но я не знаю как.. - person Algor7; 29.01.2016
comment
Я вижу, что InCallAdapter не отображается в API. Посмотрите на это: android. googlesource.com/platform/frameworks/base/+/master/ - person Gianmarco Reverberi; 29.01.2016
comment
Да, я прошел через все эти API раньше. Если я использую какой-либо из упомянутых вами, то вопрос остается прежним: как инициализировать объект IInCallAdapter, потому что классу Call необходимо передать объект InCallAdapter в качестве параметра при создании объекта класса Call, а интерфейс IInCallAdapter должен передать в качестве параметра при создании объекта InCallAdapter. Следовательно, вопрос остается прежним. - person Algor7; 29.01.2016
comment
Вы смотрели на InCallService? - person Gianmarco Reverberi; 30.01.2016