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();
        }
    }

我将文件传输回桌面(通过电子邮件),但我也无法在那里打开它。我刚刚发现,当我用 Adob​​e Reader 打开它时,我会得到一个“受保护”标签。我要疯了吗?

从我的应用程序下载并从我的计算机打开的 pdf 的图像 在此处输入图像描述

请帮助我,并提前感谢。

4

2 回答 2

0

首先,您需要使用Environment对象中的方法替换 SD 卡的硬编码路径。

其次,问题仍然是您所说的copy是什么意思。一个文件不可能打开但不能被同一用户复制,那么您是否尝试使用不同的用户 ID(应用程序)复制它?如果是这样,这显然是一个访问权限问题。您可能想要决定是否使用Environment.getExternalStorageDirectory()Environment.getExternalStoragePublicDirectory并且您可能想要根据MODE_提供的用于与FileOutputStream.

于 2013-01-21T11:56:14.797 回答
0

首先,请不要像你一样扔掉错误。请至少在调试时使用 android.util.Log 来记录异常。

放置 android.util.Log.d("ANDRO_ASYNC", "发生异常", e); 在返回 null 之前;在 catch {} 块中。我想你甚至不知道什么时候发生了一些错误。

而且我相信只有在打开 url 流之后才能获得内容长度。我猜你使用 HTTP,它应该只在你打开流进行阅读时发送请求。如果你想要 POST 消息,你可以写入缓冲区,它怎么知道你想要什么?

并且应该在 try 子句之前创建流变量,并分配 null。您可以打开一个描述符,但第二个可能会因异常而失败。你应该在抓住它后关闭它。为此使用 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 回答