2011-05-02 4 views
2

Im essayant de comprendre un bug liad sur ma table aujourd'hui. Je n'ai pas beaucoup développé pour Java/Android mais j'essaie de comprendre cela de toute façon.Appel de transfert Android

J'ai une application Android développée par un collègue qui a démissionné. Actuellement, l'application est opérationnelle en 2.2. Mais lors de l'exécution avec 2.3 l'application échoue.

C'est une application qui aide à transférer des appels au sein d'un commutateur de télécentre.

Alors qu'est-ce qui se passe est-ce.

La personne A (numéro interne 001) reçoit un appel de M. X. Personne A répond et sais Salut ouais Personne B (numéro interne 002) a une grande connaissance de ce problème! Laissez-moi vous transférer à lui! La personne A appelle ensuite 002 sur son téléphone portable et attend environ 10 (assez longtemps pour que l'appel passe et commence à dérailler), puis effectue un autre appel au numéro 4 (commande interne de transfert de télécom) pour transférer MR.X à Personne B.

Ceci est en bref ce que l'application fait en cliquant simplement sur une personne dans la liste.

Personne premier appel B, délai de 10 sek numéro d'appel 4.

//Initial Call(002) 
public void callNumber(String callnum){ 
    Intent intent = new Intent(Intent.ACTION_CALL); 
    intent.setData(Uri.parse("tel:"+callnum)); 
    startActivity(intent); 

    if(isAutomaticTransfer && stateString.equals("Off Hook")){ 
     _initTask = new InitTask(); 
     _initTask.execute(this); 
    } 
} 

puis

protected class InitTask extends AsyncTask<Context, Integer, Integer>{ 
    @Override 
    protected Integer doInBackground(Context... arg0) { 

     try { 
      Thread.sleep(delayLength); 
      Intent intentTransfer = new Intent(Intent.ACTION_CALL); 
      intentTransfer.setData(Uri.parse("tel:" + transfernum)); 
      intentTransfer.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

      startActivity(intentTransfer); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

Comme indiqué cela fonctionne avec 2.2.

Cependant avec 2.3 je reçois le stacktrace suivant.

/ActivityManager( 61): Starting: Intent { act=android.phone.extra.NEW_CALL_IN 
TENT dat=tel:xxx-xxx-xxxx flg=0x10000000 cmp=com.android.phone/.SipCallOptionHan 
dler (has extras) } from pid 123 
V/SipCallOptionHandler( 123): Call option is SIP_ADDRESS_ONLY 
I/ActivityManager( 61): Starting: Intent { act=android.intent.action.CALL dat= 
tel:xxx-xxx-xxxx flg=0x10000000 cmp=com.android.phone/.InCallScreen (has extras) 
} from pid 123 
D/CallManager( 123): hasBgCall: false sameChannel:true 
D/dalvikvm( 123): GC_CONCURRENT freed 305K, 48% free 3199K/6151K, external 6585 
K/6853K, paused 14ms+5ms 
D/dalvikvm( 61): GREF has increased to 401 
D/dalvikvm( 123): GC_EXTERNAL_ALLOC freed 8K, 49% free 3191K/6151K, external 59 
27K/6853K, paused 63ms 
W/InputManagerService( 61): Starting input on non-focused client com.android.i 
[email protected] (uid=10035 pid=343) 
D/dalvikvm( 130): GC_EXPLICIT freed 135K, 50% free 2949K/5895K, external 5959K/ 
7152K, paused 75ms 
I/ActivityManager( 61): Starting: Intent { act=android.intent.action.CALL dat= 
tel:xxx-xxx-xxxx flg=0x10000000 cmp=com.android.phone/.OutgoingCallBroadcaster } 
from pid 343 
D/PhoneUtils( 123): checkAndCopyPhoneProviderExtras: some or all extras are mis 
sing. 
D/PhoneUtils( 123): checkAndCopyPhoneProviderExtras: some or all extras are mis 
sing. 
I/ActivityManager( 61): Starting: Intent { act=android.phone.extra.NEW_CALL_IN 
TENT dat=tel:xxx-xxx-xxxx flg=0x10000000 cmp=com.android.phone/.SipCallOptionHan 
dler (has extras) } from pid 123 
V/SipCallOptionHandler( 123): Call option is SIP_ADDRESS_ONLY 
I/ActivityManager( 61): Starting: Intent { act=android.intent.action.CALL dat= 
tel:xxx-xxx-xxxx flg=0x10000000 cmp=com.android.phone/.InCallScreen (has extras) 
} from pid 123 
W/PhoneUtils( 123): Exception from phone.dial() 
W/PhoneUtils( 123): com.android.internal.telephony.CallStateException: cannot d 
ial in current state 
W/PhoneUtils( 123): at com.android.internal.telephony.CallManager.dial(CallM 
anager.java:704) 
W/PhoneUtils( 123): at com.android.phone.PhoneUtils.placeCall(PhoneUtils.jav 
a:539) 
W/PhoneUtils( 123): at com.android.phone.InCallScreen.placeCall(InCallScreen 
.java:2667) 
W/PhoneUtils( 123): at com.android.phone.InCallScreen.internalResolveIntent(
InCallScreen.java:1188) 
W/PhoneUtils( 123): at com.android.phone.InCallScreen.onNewIntent(InCallScre 
en.java:1126) 
W/PhoneUtils( 123): at android.app.Instrumentation.callActivityOnNewIntent(I 
nstrumentation.java:1119) 
W/PhoneUtils( 123): at android.app.ActivityThread.deliverNewIntents(Activity 
Thread.java:1722) 
W/PhoneUtils( 123): at android.app.ActivityThread.performNewIntents(Activity 
Thread.java:1734) 
W/PhoneUtils( 123): at android.app.ActivityThread.handleNewIntent(ActivityTh 
read.java:1742) 
W/PhoneUtils( 123): at android.app.ActivityThread.access$2300(ActivityThread 
.java:117) 
W/PhoneUtils( 123): at android.app.ActivityThread$H.handleMessage(ActivityTh 
read.java:978) 
W/PhoneUtils( 123): at android.os.Handler.dispatchMessage(Handler.java:99) 
W/PhoneUtils( 123): at android.os.Looper.loop(Looper.java:123) 
W/PhoneUtils( 123): at android.app.ActivityThread.main(ActivityThread.java:3 
683) 
W/PhoneUtils( 123): at java.lang.reflect.Method.invokeNative(Native Method) 
W/PhoneUtils( 123): at java.lang.reflect.Method.invoke(Method.java:507) 
W/PhoneUtils( 123): at com.android.internal.os.ZygoteInit$MethodAndArgsCalle 
r.run(ZygoteInit.java:839) 
W/PhoneUtils( 123): at com.android.internal.os.ZygoteInit.main(ZygoteInit.ja 
va:597) 
W/PhoneUtils( 123): at dalvik.system.NativeStart.main(Native Method) 
W/InCallScreen( 123): placeCall: PhoneUtils.placeCall() FAILED for number '4'. 
W/InCallScreen( 123): onNewIntent: status CALL_FAILED from internalResolveInten 
t() 
W/InputManagerService( 61): Window already focused, ignoring focus gain of: co 
[email protected] 
D/dalvikvm( 125): GC_CONCURRENT freed 255K, 51% free 2844K/5767K, external 2219 
K/2674K, paused 6ms+94ms 

Alors j'ai pensé à demander s'il y avait une solution simple à ce problème avant que je pose toutes ces heures sur ce problème?

Merci!

EDIT: J'ai même essayé de faire cette procédure à la main (prendre un appel incomming, mettre en attente, appeler un collègue et encore appeler le chiffre 4 pour le transférer) même erreur que l'application obtient. Ainsi, Android a-t-il bloqué la fonctionnalité des standards mobiles?

EDIT: Ce bogue affecte uniquement les téléphones Android «vanille» de Google. HTC Samsung ne l'a pas! Cas confirmé: Nexus S

+0

Etes-vous sûr que cela fonctionne dans Android 2.2 ... Parce que ce problème se produit uniquement lorsque le nombre d'appels entrant/sortant est supérieur à 2 ... Vérifiez-le à nouveau contre 2.2 et laissez-nous savoir .. – Dinash

+0

Il fonctionne dans anroïde 2.2, nous avons une application qui fonctionne et les gens l'utilisent, seulement les personnes avec 2.3 qui ne peuvent pas y accéder. – Anders

+0

Rien? : ((((( – Anders

Répondre

3

Je pense que le problème est que PhoneUtils (qui lance l'exception) a déjà un appel en cours qui n'est pas inactif. Si vous regardez la source de PhoneUtils (par ex.ici: http://hi-android.info/src/com/android/internal/telephony/gsm/GsmCallTracker.java.html) et de rechercher l'exception "ne peut pas composer dans l'état actuel" vous verrez que les conditions pour lancer cette exception sont qu'il y a un appel actif. Vous devez donc d'abord mettre l'appel actif en attente, puis lancer le nouvel appel. Je ne sais pas pourquoi cela fonctionnait en 2.2 et pas en 2.3 mais je suppose qu'ils ont changé certaines façons de gérer les appels.

+0

Okey c'est ce que j'ai découvert aussi, mais je n'ai pas trouvé un moyen de contourner cela .. Comment pourrais-je procéder pour faire le personne b appel en attente avant d'appeler le numéro de transfert? – Anders

1

L'exception est levée here. Comme le Javadoc pour dial function décrit, CallStateException est jeté "si un nouvel appel sortant n'est pas actuellement possible car plus aucun créneau d'appel n'existe ou un appel existe qui compose, alerte, sonne ou attend". Il semble que, dans votre exemple, l'appel à la personne B continue de sonner et qu'un nouvel appel ne puisse plus être composé. Il semble que la classe CallManager n'existait pas en 2.2, bien que sans recherches supplémentaires, je ne peux pas être sûr de ce qui se trouvait à sa place (et pourquoi de tels appels simultanés étaient autorisés alors qu'ils ne le sont pas).

+0

Salut oui je J'ai découvert cela aussi, mais comment est-ce que je pourrais contourner ce problème? Est-ce que c'est possible? – Anders

0

Ce bug affecte uniquement les téléphones Android «vanille» de Google. HTC Samsung ne l'a pas! Cas confirmé: Nexus S