0

Twilioクライアントをより大きなアプリケーションに統合しようとしています。電話をかけるまでは、すべて正常に機能しているようdevice.connect(parameters, connectionListener)です。31100 Generic Malformed Requestエラーが発生しました。それだけです。

同じデバイスで、同じTwilioアカウントと同じTwilioアプリケーションを使用して、Twilio Android SDK(MonkeyPhone)で提供されるサンプルコードは完全に機能します。

エラーの意味や考えられる原因について、これ以上の詳細を見つけることができません。無効なデータを送信していると想定していますが、それがどのように可能かわかりません。機能トークンはOKです。MonkeyPhoneサンプルアプリで生成されたものと照合して検証しました。作品の作成はDevice問題なく、エラーはありません。メソッドでパラメーターを送信していない場合でも、エラーがスローされますconnect()。のonConnecting()メソッドConnectionListeneronDisconnected(Connection inConnection, int inErrorCode, String inErrorMessage)呼び出されますが、Malformed Requestエラーが発生して呼び出されます。

Voice TwiMLのコードは正常に機能しています。これは、<Dial>可能な限り最も単純な動詞を生成する単純なPHPスクリプトです。

<Response>
    <Dial>someone</Dial>
</Response>

その他の特定の情報...アプリケーションで別のサービスを実行しており、他のさまざまな操作を実行するために使用されています。これは何らかの形で干渉する可能性がありますか?また、私はトライアルアカウントを使用しており、実際の電話番号への発信がサポートされていないルーマニアに住んでいます(ただし、とにかく電話番号を使用していません)。これは私に何らかの影響を与える可能性がありますか?

巨大なコードの壁を投げてしまったことを前もってお詫びしますが、2番目の目で何か問題を見つけられることを願っています。これは、MonkeyPhoneサンプルに最も類似したコードのバージョンです。唯一の違いは、AsyncTaskを使用して機能トークン(JsonAsyncRequestWithErrorクラス)を取得していることです。

public class MonkeyPhone implements Twilio.InitListener, DeviceListener {
private static final String TAG = "MonkeyPhone";

private Context context;
private Device device;
private Connection connection;

public MonkeyPhone(Context context) {
    this.context = context;
    Twilio.initialize(context, this /* Twilio.InitListener */);
}

@Override
/* Twilio.InitListener method */
public void onInitialized() {
    Log.d(TAG, "Twilio SDK is ready");

    // the Emulator has a somewhat unique "product" name
    String clientName = "doug";

    HttpGet get = new HttpGet("http://teamphoenix.zzl.org/capability.php?ClientName=" + clientName);

    JsonAsyncRequestWithError asyncRequestWithError = new JsonAsyncRequestWithError(context, "test", new AsyncRequestWithErrorListener() {

        @Override
        public void onResult(AsyncRequestResponse response, Object destination) {
            createDevice(response.getMessage());
        }

        @Override
        public void onErrorResult(AsyncRequestResponse response, Object destination) {

        }
    });

    asyncRequestWithError.execute(get);

}

public void createDevice(String token) {
    try {
        device = Twilio.createDevice(token, this /* DeviceListener */);

        Intent intent = new Intent(context, SpringshotPhoneActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        device.setIncomingIntent(pendingIntent);

    } catch (Exception e) {
        Log.e(TAG, "", e);
    }
}

@Override
/* Twilio.InitListener method */
public void onError(Exception e) {
    Log.e(TAG, "Twilio SDK couldn't start: " + e.getLocalizedMessage());
}

@Override
/* DeviceListener method */
public void onStartListening(Device inDevice) {
    Log.i(TAG, "Device is now listening for incoming connections");
}

@Override
/* DeviceListener method */
public void onStopListening(Device inDevice) {
    Log.i(TAG, "Device is no longer listening for incoming connections");
}

@Override
/* DeviceListener method */
public void onStopListening(Device inDevice, int inErrorCode, String inErrorMessage) {
    Log.i(TAG, "Device is no longer listening for incoming connections due to error " + inErrorCode + ": " + inErrorMessage);
}

@Override
/* DeviceListener method */
public boolean receivePresenceEvents(Device inDevice) {
    return false; // indicate we don't care about presence events
}

@Override
/* DeviceListener method */
public void onPresenceChanged(Device inDevice, PresenceEvent inPresenceEvent) {
}

public void connect(String phoneNumber) {
    Map<String, String> parameters = new HashMap<String, String>(1);
    parameters.put("PhoneNumber", phoneNumber);
/// ---------------- THIS IS THE CALL THAT FAILS ------------------------------------//
    connection = device.connect(parameters, null /* ConnectionListener */);
    if (connection == null)
        Log.w(TAG, "Failed to create new connection");
}

public void disconnect() {
    if (connection != null) {
        connection.disconnect();
        connection = null;
    }
}

public void handleIncomingConnection(Device inDevice, Connection inConnection) {
    Log.i(TAG, "Device received incoming connection");
    if (connection != null)
        connection.disconnect();
    connection = inConnection;
    connection.accept();
}

@Override
protected void finalize() {
    if (connection != null)
        connection.disconnect();
    if (device != null)
        device.release();
}
}

どうもありがとうございます!

4

1 に答える 1

2

私は問題を理解しました。どうやら、UTF-8エンコーディングを使用してサーバーからInputStreamを読み取る必要がありました(トークンに特殊文字がない場合でも)。

    char[] buf = new char[1024];
    InputStream is = response.getEntity().getContent();
    StringBuilder out = new StringBuilder();

    Reader in = new InputStreamReader(is, "UTF-8");

    int bin;
    while ((bin = in.read(buf, 0, buf.length)) >= 0) {
        out.append(buf, 0, bin);
    }

    return out.toString();
于 2012-07-24T08:30:30.160 に答える