从代码下载PDF时受到保护

时间:2013-01-21 11:16:53

标签: android pdf

这可能看起来很奇怪,但是当我从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图片 enter image description here

请帮助我,并提前致谢。

2 个答案:

答案 0 :(得分:0)

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

其次,问题仍然是 copy 的含义。文件不可能被打开但不能被同一个用户复制,那么您是否可以尝试使用不同的用户ID(应用程序)进行复制?如果是这样,那就是一个访问权限问题。您可能想要决定是使用Environment.getExternalStorageDirectory()还是Environment.getExternalStoragePublicDirectory,并且您可能希望根据MODE_提供的FileOutputStream标记来设置访问权限。

答案 1 :(得分:0)

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

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

我相信只有在你打开网址流后才能获得内容长度。我猜你使用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权限吗?