2

今日、私のテーブルにいるバグリアッドを見つけようとしています。私はJava/Android用にあまり開発していませんが、とにかくこれを理解しようとしています.

退職した同僚が開発した Android アプリがあります。現在、アプリは 2.2 で動作しています。しかし、2.3 で実行するとアプリが失敗します。

電話会社の交換機内で通話を転送するのに役立つアプリです。

それで何が起こるかはこれです。

人物 A (内部番号 001) は、X 氏から電話を受けました。人物 A は応答し、「はい、そうです」 人物 B (内部番号 002) はこの問題について十分な知識を持っています。あなたを彼に転送させてください!

次に、人物 A は自分の携帯電話で 002 に電話し、約 10 (通話が終了して通話を開始するのに十分な時間) 待ってから、番号 4 に別の電話をかけ (電話会社の内部転送コマンド)、MR.X を人物 B に転送します。

これは要するに、リスト内の人をクリックするだけでアプリが行うことです。

最初に人物 B に電話し、10 秒遅れて番号 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 );
    }
}

その後

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;
    }
}

述べたように、これは 2.2 で動作します。

ただし、2.3 では、次のスタック トレースを取得します。

/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
nternal.view.IInputMethodClient$Stub$Proxy@40530dd8 (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
m.android.internal.view.IInputMethodClient$Stub$Proxy@406f3830
D/dalvikvm(  125): GC_CONCURRENT freed 255K, 51% free 2844K/5767K, external 2219
K/2674K, paused 6ms+94ms

だから私は、この問題に何時間も費やす前に、この問題に対する簡単な解決策があるかどうかを尋ねようと思いましたか?

ありがとう!

編集:私はこの手順を手動で実行しようとしました(着信コールを取り、保留にし、同僚に電話し、再び数字4を呼び出して転送します)、アプリが取得するのと同じエラー。では、アンドロイドは携帯交換機の機能をブロックしたのでしょうか?

編集: このバグは、Google によって狂った「バニラ」の Android 携帯にのみ影響します。HTC Samsung にはありません。確認済みケース: Nexus S

4

3 に答える 3

3

問題は、PhoneUtils(例外をスローする)にアイドル状態ではない進行中の呼び出しがすでにあることだと思います。PhoneUtilsのソース(例:http://hi-android.info/src/com/android/internal/telephony/gsm/GsmCallTracker.java.html)を調べて、現在のダイヤルインはできません」という例外を検索する場合状態」この例外をスローするための条件は、アクティブな呼び出しがあることであることがわかります。したがって、最初にアクティブな呼び出しを保留にしてから、新しい呼び出しを開始する必要があります。

2.2で機能していた理由と、2.3で機能しなかった理由はわかりませんが、呼び出しの処理方法の一部が変更されたと思います。

于 2011-05-05T13:18:04.487 に答える
1

ここで例外がスローされています。そのダイヤル機能の Javadoc で説明されているように、 「これ以上コール スロットが存在しないか、ダイヤル中、アラート中、呼び出し中、または待機中のコールが存在するために、新しい発信コールが現在不可能な場合CallStateException」がスローされます。あなたの例では、人物 B への通話がまだ鳴っているため、新しい通話をダイヤルできなくなっているように聞こえます。

このCallManagerクラスは 2.2 には存在しなかったようですが、それ以上の調査を行わないと、その場所に何があったのか (また、現在は許可されていないのに、なぜそのような同時呼び出しが許可されたのか) はわかりません。

于 2011-05-05T13:09:32.113 に答える
0

このバグは、Google によって狂った「バニラ」の Android スマートフォンにのみ影響します。HTC Samsung にはありません。確認済みケース: Nexus S

于 2011-10-21T14:28:56.963 に答える