我从聊天中获取.pdf文件,我想下载它并使用acrobat reader显示它。以下是我的代码
public void showPDF(String pdf)
{
try
{
Log.i("pic", " * * * in showPdf" + pdf);
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File folder = new File(extStorageDirectory, "pdf");
folder.mkdir();
String pdf_name = pdf.replace(".pdf", "");
pdf_name = pdf_name.replace("/fileupload/data/chat/", "");
File file = new File(folder, pdf_name + ".pdf");
try
{
file.createNewFile();
}
catch (IOException e1)
{
e1.printStackTrace();
}
Log.i("pic", " * * * ready to download");
new DownloadFile(file, Functions.getServiceProtocol() + Functions.getServiceDomain() + pdf, pdf_name).execute();
}
catch (Exception e)
{
Log.i("pic", " CATCH * * * in showPdf");
}
}
}
private class DownloadFile extends AsyncTask<String, Integer, String>
{
private String fileURL, pdfname;
private File directory;
private ProgressDialog dlg = new ProgressDialog(CameraWebview.this);
public DownloadFile(File d, String f, String n)
{
directory = d;
fileURL = f;
pdfname = n;
}
@Override
protected String doInBackground(String... sUrl)
{
try
{
Log.i("pic", " TRY * * * download file");
FileOutputStream f = new FileOutputStream(directory);
URL u = new URL(fileURL);
HttpURLConnection c = (HttpURLConnection)u.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
InputStream in = c.getInputStream();
byte[] buffer = new byte[1024];
long total = 0;
int count;
while ((count = in.read(buffer)) != -1) {
total += count;
f.write(buffer, 0, count);
}
f.flush();
f.close();
try
{
Log.i("pic", " TRY * * * calling displayPdf");
displayPdf(pdfname);
}
catch(Exception ex)
{
Log.i("pic", " CATCH * * * calling displayPdf");
}
}
catch (Exception e)
{
}
return null;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
dlg.setMessage("Downloading File ...");
dlg.show();
}
@Override
protected void onProgressUpdate(Integer... progress)
{
super.onProgressUpdate(progress);
mProgressDialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
if (dlg.isShowing())
dlg.dismiss();
}
}
public void displayPdf(String pdf_name)
{
try
{
Log.i("pic", " TRY * * * ready to show pdf");
File file = new File(Environment.getExternalStorageDirectory() + "/pdf/" + pdf_name + ".pdf");
PackageManager packageManager = getPackageManager();
Intent testIntent = new Intent(Intent.ACTION_VIEW);
testIntent.setType("application/pdf");
List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/pdf");
startActivity(intent);
Log.i("pic", " TRY * * * here is the pdf");
}
catch (Exception e)
{
Log.i("pic", " CATCH * * * show pdf file" + e.toString());
}
它总是说“已损坏的文件”。我检查了我正在使用的网址,这很好。我的应用程序也是Ice Cream Sandwitch。我做错了什么?
答案 0 :(得分:1)
当你致电DownloadFile(File d, String f, String n)
时,你如何获得目录?
如果您使用getExternalStorageDirectory
(我假设您是),则该pdf对您的应用程序是私有的,并且其他应用程序无法访问。
如果您需要将该文件保密为您的应用程序,并且仍然可以使用其他应用程序打开,请使用ContentProvider
如果您可以将该文件保存在共享目录中,则应使用getExternalStoragePublicDirectory()
获取保存文件的路径,然后再检索文件URI。
此问题与this问题有关,因此答案相似。
这应该可以解决问题:
内部showPDF
:
String extStorageDirectory = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS).toString();
内部displayPdf
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/pdf/" + pdf_name + ".pdf");
答案 1 :(得分:1)
你在setRequestMethod(“GET”)之后使用setDoOutput(true)。
setDoOutput(true)将您的请求方法自动设置为POST。
答案 2 :(得分:0)
theurl = new URL(url);
InputStream in = null;
File dst = new File(Environment.getExternalStorageDirectory()+"/file.pdf");
try {
in = theurl.openStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
OutputStream out = null;
try {
out = new FileOutputStream(dst);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
}
// Transfer bytes from in to out
try {
byte[] buf = new byte[100000];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}