1

奇妙に思えるかもしれませんが、AsyncTask から PDF をダウンロードすると、コピーまたは編集できないように保護されているように見えます。よく開けます。同じファイルをブラウザからダウンロードする場合、制限はありません。何が起こっている?

これが私の問題の基礎です。私の本当の問題は、android pdf のリーダーの多くがファイルを開くことができないことです。

ダウンロード用の私のコード:

次のコードを使用して PDF ファイルをダウンロードしています。

    class DownloadFileAsync extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showDialog(DIALOG_DOWNLOAD_PROGRESS);
        }

        @SuppressLint({ "SdCardPath", "SdCardPath" })
        @Override
        protected String doInBackground(String... aurl) {
            int count;

        try {

        URL url = new URL(aurl[0]);
        URLConnection conexion = url.openConnection();
        conexion.connect();

        int lenghtOfFile = conexion.getContentLength();
        Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream("/sdcard/Download/prueba.pdf");

        byte data[] = new byte[1024];

        long total = 0;

            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress(""+(int)((total*100)/lenghtOfFile));
                output.write(data, 0, count);
            }
            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {}
        return null;

        }
        protected void onProgressUpdate(String... progress) {
             Log.d("ANDRO_ASYNC",progress[0]);
             mProgressDialog.setProgress(Integer.parseInt(progress[0]));
        }

        @Override
        protected void onPostExecute(String unused) {
            dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
            operationsWithSD();
        }
    }

ファイルをデスクトップに (電子メールで) 転送しましたが、デスクトップでも開くことができません。Adobe Reader で開くと、「保護された」ラベルが表示されることを発見しました。私は夢中になっていますか?

アプリからダウンロードしてコンピューターから開いた PDF の画像 ここに画像の説明を入力

よろしくお願いします。

4

2 に答える 2

0

まず第一に、あなたのようにエラーを捨てないでください。少なくともデバッグするときは、android.util.Logを使用して例外をログに記録してください。

place android.util.Log.d( "ANDRO_ASYNC"、 "例外が発生しました"、e); nullを返す前。キャッチ{}ブロックで。いつエラーが発生したのかさえわからないと思います。

そして、URLストリームを開いた後にのみコンテンツの長さを取得する必要があると思います。HTTPを使用していると思いますが、読み取り用にストリームを開いた場合にのみリクエストを送信する必要があります。POSTメッセージが必要な場合は、バッファに書き込むことができます。どのようにして、何が必要かを知ることができますか?

そして、そのストリーム変数は、nullを割り当ててtry句の前に作成する必要があります。1つの記述子を開くことはできますが、2番目の記述子は例外で失敗する可能性があります。捕まえたら閉じてください。そのためにfinallyキーワードを使用します。

    InputStream input = null;
    OutputStream output = null;
    try {

    URL url = new URL(aurl[0]);
    URLConnection conexion = url.openConnection();
    conexion.connect();

    input = new BufferedInputStream(url.openStream());
    output = new FileOutputStream(Environment.getExternalStorageDirectory()+"/Download/prueba.pdf");

    byte data[] = new byte[1024];

    int lenghtOfFile = conexion.getContentLength();
    Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

    long total = 0;

        while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress(""+(int)((total*100)/lenghtOfFile));
            output.write(data, 0, count);
        }
    } catch (Exception e) {
        Log.d("ANDRO_ASYNC", "Exception thrown", e);
    } finally {
        if (output != null) {
            output.flush();
            output.close();
        }
        if (input != null)
          input.close();

    }

ダウンロードしたPDFのサイズを確認してください。エラーが発生したため、サイズは0バイトだと思います。マニフェストで使用されているandroid.permission.WRITE_EXTERNAL_STORAGE権限を持っていますか?

于 2013-01-22T10:09:38.817 に答える
0

まず、Environmentオブジェクトのメソッドを使用して、SD カードのハードコードされたパスを置き換える必要があります。

第二に、あなたがcopyで何を意味するのかという問題が残ります。同じユーザーがファイルを開くことはできても、コピーすることはできない可能性は低いので、別のユーザー ID (アプリケーション) を使用してコピーしようとしている可能性はありますか? もしそうなら、それは明らかにアクセス権の問題です。Environment.getExternalStorageDirectory()またはを使用するかどうかを決定したい場合や、で使用するために提供されたフラグEnvironment.getExternalStoragePublicDirectoryに基づいてアクセス権を設定したい場合があります。MODE_FileOutputStream

于 2013-01-21T11:56:14.797 に答える