2016-01-28 2 views
1

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

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; 

    } 

} 

} 

Вот Logcat:

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} 

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

+0

Вы можете увидеть мой проект на [Github] (HTTPS : //github.com/rajeshincorp). – Algor7

ответ

0

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

+0

Поскольку IInCallAdapter является интерфейсом, который расширяет IInterface, и я думаю, что это так, как мы инициализируем обычный объект интерфейса в активности, но это другой вид интерфейса (bcz он расширяет IInterface) ... и этот метод инициализации не работает с этим вид интерфейса ... действительно, я не знаю, как инициализировать этот «mIInCallAdapter». – Algor7

+0

Нет. Способ, которым вы инициализируете интерфейс, - это создать класс, который его реализует, и создать экземпляр страхования этого класса. Вы не можете управлять какой-либо деятельностью, если она не реализует ее. –

+0

Обычно мне нравится это. I.java => public interface I {public void fun (int a); } – Algor7

0

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

public class ClassName implements IInCallAdapter { 
    ... 
} 

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

+0

Это основная проблема, когда класс реализации уже существует, и я ничего не знаю об этом (почти слепой). У меня только этот интерфейс IInCallAdapter и вы хотите его использовать. Я просто знаю, что существует некоторый внутренний класс реализации, который реализует этот интерфейс IInCallAdapter и посылает DTMF-сигналы по активному вызову, переопределяя метод playDtmfTone (String s, char c), мне просто нужно использовать этот интерфейс в своей деятельности, но не знаю как .. – Algor7

+0

Я вижу, что InCallAdapter не отображается в API. Посмотрите на это: https://android.googlesource.com/platform/frameworks/base/+/master/telecomm/java/android/telecom/InCallAdapter.java –

+0

Как насчет класса вызовов? http://developer.android.com/reference/android/telecom/Call.html#playDtmfTone(char) –

Смежные вопросы