getContentLength()は-1を返す一部のデバイスではなく他の人に
-
26-09-2019 - |
質問
私は、私はそれをダウンロードする前に、ファイルのサイズを取得しようとしています。私はこれを行うにはconn.getContentLength();
を使用して、それは私の自宅のコンピュータアンドロイド2.1エミュレータ上の罰金に動作します。
それはしかし、仕事をしません。
んの誰もが、このための回避策を知っていますか?私は多分HttpURLConnection
を使用せずに、ファイルのサイズを取得することができます別の方法があります。
解決
この情報は常に利用できません。通常、あなたがダウンロードしているファイルの長さを知ることができます。 Webサーバによっては、プロトコル、接続、およびダウンロードの方法は、この情報は常に利用できない場合があります。
それはこのような状況に対処できるように、あなたは間違いなくあなたのアプリケーションを変更する必要があります。私はあなたが別の接続方法を使用して、異なるデバイスがこれに異なる結果を提供することがわかりになると思います。
他のヒント
を使用するには、あなたのファイルのダウンロードのためにHttpVersion.HTTP_1_0
。これを防止「チャンク転送エンコーディング」の使用
を参照してください: 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();