getContentLength () возвращает -1 на некоторых устройствах, а не на других - PullRequest
1 голос
/ 01 сентября 2010

Я пытаюсь получить размер файла, прежде чем загрузить его.Для этого я использую conn.getContentLength();, и он отлично работает на моих домашних компьютерах. Эмулятор Android 2.1.

Однако он не работает после запуска приложения с телефона (WiFi или 3G), а также не работает.не работает, когда я запускаю его со своих рабочих ноутбуков Эмулятор Android 2.1.

Кто-нибудь знает обходной путь для этого?Есть ли другой способ получить размер файла, возможно, без использования HttpURLConnection.

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Эта информация не всегда будет доступна. Обычно вы будете знать длину загружаемого вами файла. В зависимости от веб-сервера, протокола, соединения и метода загрузки эта информация может быть не всегда доступна.

Вам определенно следует изменить свое приложение, чтобы оно могло справиться с этой ситуацией. Я думаю, вы обнаружите, что разные устройства, использующие разные способы подключения, будут предлагать разные результаты при этом.

0 голосов
/ 10 марта 2012

Используйте HttpVersion.HTTP_1_0 для загрузки файлов. Это предотвращает использование «Chunked Transfer Encoding»

См .: http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Например, перегрузите конструктор, чтобы вы могли указать, какая версия HTTP:

public class HTTPrequest
{
    //member variables
    private SchemeRegistry mSchemeRegistry;
    private HttpParams mHttpParams;
    private SingleClientConnManager mSCCmgr;
    private HttpClient mHttpClient;
    private HTTPrequestListener mHTTPrequestListener = null;

    //constants
    private final int TIMEOUT_CONNECTION = 20000;//20sec
    private final int TIMEOUT_SOCKET = 30000;//30sec

    //interface for callbacks
    public interface HTTPrequestListener
    {
        public void downloadProgress(int iPercent);
    }

    /**
     * Creates an HttpClient that uses plain text only.
     * note: Default constructor uses HTTP 1.1
     */
    public HTTPrequest()
    {
        this(HttpVersion.HTTP_1_1);
    }

    /**
     * Creates an HttpClient that uses plain text only.
     * @param httpVersion HTTP Version (0.9, 1.0, 1.1)
     */
    public HTTPrequest(HttpVersion httpVersion)
    {
        //define permitted schemes
        mSchemeRegistry = new SchemeRegistry();
        mSchemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

        //define http parameters
        mHttpParams = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(mHttpParams, TIMEOUT_CONNECTION);
        HttpConnectionParams.setSoTimeout(mHttpParams, TIMEOUT_SOCKET);
        HttpProtocolParams.setVersion(mHttpParams, httpVersion);
        HttpProtocolParams.setContentCharset(mHttpParams, HTTP.UTF_8);

        //tie together the schemes and parameters
        mSCCmgr = new SingleClientConnManager(mHttpParams, mSchemeRegistry);

        //generate a new HttpClient using connection manager and parameters
        mHttpClient = new DefaultHttpClient(mSCCmgr, mHttpParams);
    }

    public void setHTTPrequestListener(HTTPrequestListener httpRequestListener)
    {
        mHTTPrequestListener = httpRequestListener;
    }

    //other methods for POST and GET
}

Если вы хотите загрузить файл, используйте HTTPrequest httpRequest = new HTTPrequest(HttpVersion.HTTP_1_0);, а когда вы хотите сделать POST или GET, используйте HTTPrequest httpRequest = new HTTPrequest();

...