getContentLength() возвращает -1 на некоторых устройствах, а не на других
Я пытаюсь получить размер файла, прежде чем загрузить его. я использую conn.getContentLength();
чтобы сделать это, и он отлично работает на моих домашних компьютерах Android 2.1 Emulator.
Однако он не работает, когда я запускаю свое приложение с телефона (WiFi или 3G), и также не работает, когда я запускаю его с моего рабочего ноутбука эмулятор Android 2.1.
Кто-нибудь знает обходной путь для этого? Есть ли другой способ получить размер файла, возможно, без использования HttpURLConnection
,
2 ответа
Эта информация не всегда будет доступна. Обычно вы будете знать длину загружаемого вами файла. В зависимости от веб-сервера, протокола, соединения и способа загрузки эта информация может быть не всегда доступна.
Вы должны определенно изменить свое приложение, чтобы оно могло справиться с этой ситуацией. Я думаю, вы обнаружите, что разные устройства, использующие разные способы подключения, будут предлагать разные результаты.
Использование 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();