7

別のアプリケーションが私のアプリにファイルを送信しているときに、intent.getExtras().get(EXTRA_STREAM)プロパティを介して Uri を取得します。次に、inputstream を使用してファイルのバイトを取得できます。new BufferedInputStream(activity.getContentResolver().openInputStream(uri));

すべてが順調で、これまでのところ機能しています。今、ユーザーに何らかの進行状況を表示したいのですが、事前にストリームを完全に読み取らずにファイルの合計バイト数を取得する方法がわかりません (進行状況バーの目的全体が無効になります) ) ...

試してみParcelFileDescriptor fileDesc = activity.getContentResolver().openFileDescriptor(uri, "r");ましたが、これはタイプの uris でのみ機能しfile://...ます。

たとえば、Skydrive からファイルを受信すると、次のようにcontent://..Uri を取得します。content://com.microsoft.skydrive.content.external/external_property/10C32CC94ECB90C4!155/Sunset.480p.mp4

そのような Uri では、(当然のことながら) "FileNotFoundException : ファイル全体ではありません" という例外が発生します。

私が取得するデータストリームの合計サイズを取得する確実な方法はありますか?

4

2 に答える 2

1

ストリーム全体を読み取る以外に、ストリームのサイズを取得するための一般的な解決策はありません。これは簡単に証明できます。ある URL に対して、ランダムな時間に終了するランダムなテキスト ストリームを生成する Web サーバーを作成できます。(実際、設計によるものかどうかにかかわらず、そのような URL が存在すると確信しています :-) そのような場合、ストリームのサイズは、最後のバイトが生成されるまでわかりません。

そのため、ストリーム サイズがサーバーから送信される場合は、アプリケーション固有の方法で送信する必要があります。

SkyDrive を使用したことはありませんが、Google でその API を検索すると、このリンクが見つかりました。このリンクには、次の Android Java アプリの例があります。

public void readFile() {
    String fileId =  "file.a6b2a7e8f2515e5e.A6B2A7E8F2515E5E!141";
       client.getAsync(fileId, new LiveOperationListener() {
        public void onError(LiveOperationException exception, LiveOperation operation) {
               resultTextView.setText("Error reading file: " + exception.getMessage());
           }
           public void onComplete(LiveOperation operation) {
            JSONObject result = operation.getResult();
            String text = "File info:" +
                "\nID = " + result.optString("id") +
                "\nName = " + result.optString("name");
               resultTextView.setText(text);
           }
       });
}

そのページの他の例に基づいて、次のようなもの(または多分?)でファイルのサイズがわかると思います。result.optString("size")result.optInt("size")

于 2013-09-12T14:18:46.450 に答える