Ошибка Blackberry HttpConnection на устройстве - PullRequest
0 голосов
/ 21 марта 2012

Я снова после нескольких предложений BlackBerry.Я разрабатываю приложение на основе REST, используя стандартный BB-код, который добавляется к строке подключения URI (я буду публиковать, если хотите, но не хотите занимать здесь место, так как подозреваю, что те из вас, кто знает об этом, знаютименно то, что я имею в виду).

Код отлично работает в эмуляторе в режиме MDS и хорош на телефоне также с прямым WiFi.

Теперь проблема в том, когда я прихожу использовать 3Gна реальном телефоне.В этот момент это не удается.Это какая-то проблема с перекодировкой?

Я использую необработанный HttpConnection.

HTTP POST работает (с информацией о теле), но GET (который использует куки для аутентификации в качествезаголовок requestproperty) терпит неудачу.

Ошибка возникает только с информацией на основе заголовка (GET) о подключениях без WiFi на мобильном устройстве.

Любые предложения будут наиболее приветствоваться.

public static String httpGet(Hashtable params, String uriIn) {

        String result = null;

        LoginDetails loginDetails = LoginDetails.getInstance();

        HttpConnection _connection;

        String uri = uriIn + "?api_key=" + loginDetails.getApi_key();

        Enumeration e = params.keys();

        // iterate through Hashtable keys Enumeration
        while (e.hasMoreElements()) {
            String key = (String) (e.nextElement());
            String value = (String) params.get(key);

            uri += "&" + key + "=" + value;

        }

        uri = uri + HelperMethods.getConnectionString();

        try {

            _connection = (HttpConnection) Connector.open(uri);

            _connection.setRequestMethod(HttpConnection.GET);
            _connection.setRequestProperty("Content-Type",
                    "text/plain; charset=UTF-8");

            _connection.setRequestProperty("x-rim-authentication-passthrough",
                    "true");

            _connection.setRequestProperty("Cookie", loginDetails.getCookie());

            _connection.setRequestProperty("Content-Type", "application/json");

            String charset = "UTF-8";

            _connection.setRequestProperty("Accept-Charset", charset);
            _connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded;charset=" + charset);

            OutputStream _outputStream = _connection.openOutputStream();

            int rc = _connection.getResponseCode();

            InputStream _inputStream = _connection.openInputStream();

            ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
            int ch;
            while ((ch = _inputStream.read()) != -1) {

                bytestream.write(ch);

            }

            result = new String(bytestream.toByteArray());

            bytestream.close();


            {

                if (_outputStream != null)
                    try {
                        _outputStream.close();
                    } catch (Exception e1) {
                    }
                if (_connection != null)
                    try {
                        _connection.close();
                    } catch (Exception e2) {
                    }

            }

        } catch (IOException e3) {

            // TODO Auto-generated catch block
            e3.printStackTrace();
        }

        return result;

    }

И это использует:

public synchronized static String getConnectionString() {

        String connectionString = null;

        // Simulator behaviour is controlled by the USE_MDS_IN_SIMULATOR
        // variable.
        if (DeviceInfo.isSimulator()) {

            connectionString = ";deviceside=true";
        }

        // Wifi is the preferred transmission method
        else if (WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED) {

            connectionString = ";interface=wifi";
        }

        // Is the carrier network the only way to connect?
        else if ((CoverageInfo.getCoverageStatus() & CoverageInfo.COVERAGE_DIRECT) == CoverageInfo.COVERAGE_DIRECT) {

            String carrierUid = getCarrierBIBSUid();

            if (carrierUid == null) {
                // Has carrier coverage, but not BIBS. So use the carrier's TCP
                // network

                connectionString = ";deviceside=true";
            } else {
                // otherwise, use the Uid to construct a valid carrier BIBS
                // request

                connectionString = ";deviceside=false;connectionUID="+carrierUid + ";ConnectionType=mds-public";
            }
        }

        // Check for an MDS connection instead (BlackBerry Enterprise Server)
        else if ((CoverageInfo.getCoverageStatus() & CoverageInfo.COVERAGE_MDS) == CoverageInfo.COVERAGE_MDS) {

            connectionString = ";deviceside=false";
        }

        // If there is no connection available abort to avoid hassling the user
        // unnecssarily.
        else if (CoverageInfo.getCoverageStatus() == CoverageInfo.COVERAGE_NONE) {
            connectionString = "none";

        }

        // In theory, all bases are covered by now so this shouldn't be reachable.But hey, just in case ...
        else {

            connectionString = ";deviceside=true";
        }



        return connectionString;
    }

    /**
     * Looks through the phone's service book for a carrier provided BIBS
     * network
     * 
     * @return The uid used to connect to that network.
     */
    private synchronized static String getCarrierBIBSUid() {
        ServiceRecord[] records = ServiceBook.getSB().getRecords();
        int currentRecord;

        for (currentRecord = 0; currentRecord < records.length; currentRecord++) {
            if (records[currentRecord].getCid().toLowerCase().equals("ippp")) {
                if (records[currentRecord].getName().toLowerCase()
                        .indexOf("bibs") >= 0) {
                    return records[currentRecord].getUid();
                }
            }
        }

        return null;
    }

1 Ответ

1 голос
/ 22 марта 2012

Исправлено - см. Выше.

Оказывается, в Ури были пробелы.

Вполне загадочно, почему это работает через WiFi, а не 3G и т. Д.

...