这可能看起来很奇怪,但是当我从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图片
请帮助我,并提前致谢。
答案 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权限吗?