Reputation: 1567
I am getting an .pdf file from a chat and I want to download it and display it using acrobat reader. Following is my code
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());
}
It always say "Corrupted file". I checked the url I am using for it and it's fine. Also my app is Ice Cream Sandwitch. What am I doing wrong ?
Upvotes: 2
Views: 2439
Reputation: 3505
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();
}
Upvotes: 0
Reputation: 39403
You are using setDoOutput(true) after setRequestMethod("GET").
setDoOutput(true) sets your request method to POST automatically.
Upvotes: 1
Reputation: 1491
When you call DownloadFile(File d, String f, String n)
, how do you get the directory?
If you are using the getExternalStorageDirectory
(i'm assuming you are), that pdf is private to your application, and can't be accessed by other applications.
If you need to keep that file private to your application, and still be able to open using another application, use a ContentProvider
If you can keep that file on a shared directory, you should use getExternalStoragePublicDirectory()
to get the path to save the file, and later on to retrieve the file URI.
This problem is related to this one, hence the similar answer.
This should solve the problem:
Inside showPDF
:
String extStorageDirectory = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS).toString();
Inside displayPdf
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/pdf/" + pdf_name + ".pdf");
Upvotes: 1