Ich versuche eine app zu schreiben pdfs von url herunterladen, speichern sie auf sd, dann öffnen von adobe pdf reader oder andere apps die jemals in der lage, die pdf zu öffnen.android herunterladen pdf von url dann öffnen sie mit einem pdf-reader
jetzt unbis, ich hatte „erfolgreich heruntergeladen und auf SD-Karte gespeichert“ (aber jedes Mal, wenn ich versuche, das pdf mit einem PDF-Reader, Leser Absturz zu öffnen und zu sagen unerwartete Fehler auftreten), zum Beispiel http://maven.apache.org/maven-1.x/maven.pdf
hier ist der Code für meinen Downloader:
//........code set ui stuff
//........code set ui stuff
new DownloadFile().execute(fileUrl, fileName);
private class DownloadFile extends AsyncTask<String, Void, Void>{
@Override
protected Void doInBackground(String... strings) {
String fileUrl = strings[0]; // -> http://maven.apache.org/maven-1.x/maven.pdf
String fileName = strings[1]; // -> maven.pdf
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File folder = new File(extStorageDirectory, "testthreepdf");
folder.mkdir();
File pdfFile = new File(folder, fileName);
try{
pdfFile.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
FileDownloader.downloadFile(fileUrl, pdfFile);
return null;
}
}
public class FileDownloader {
private static final int MEGABYTE = 1024 * 1024;
public static void downloadFile(String fileUrl, File directory){
try {
URL url = new URL(fileUrl);
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
FileOutputStream fileOutputStream = new FileOutputStream(directory);
int totalSize = urlConnection.getContentLength();
byte[] buffer = new byte[MEGABYTE];
int bufferLength = 0;
while((bufferLength = inputStream.read(buffer))>0){
fileOutputStream.write(buffer, 0, bufferLength);
}
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
im Debug-Modus, kann ich die App es heruntergeladen und speichere diese pdf auf /storage/sdcard/testpdf/maven.pdf aber ich denke, die Datei kann während des Herunterladens irgendwie beschädigt werden, so öffnet es sich nicht richtig ...
hier ist der Code, wie ich beabsichtigt, sie mit anderen Reader-App zu öffnen:
File pdfFile = new File(Environment.getExternalStorageDirectory() + "/testthreepdf/" + fileName); // -> filename = maven.pdf
Uri path = Uri.fromFile(pdfFile);
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(path, "application/pdf");
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
try{
startActivity(pdfIntent);
}catch(ActivityNotFoundException e){
Toast.makeText(documentActivity, "No Application available to view PDF", Toast.LENGTH_SHORT).show();
}
HI Zack, durch das Entfernen dieser beiden Zeilen funktioniert es, ich kann auf meinem mobilen Gerät herunterladen und lesen. aber irgendwie, jedes Mal wenn ich versuchte, das DLed pdf auf dem Emulator zu lesen, stürzt es ab, irgendeine Idee warum? Ich benutze diesen Adobe Reader apk -> http://www.appsapk.com/adobe-reader/ Haben Sie auf Emulator oder Ihr Gerät gelesen? thx – seph
und auch, ich möchte wissen, warum, indem diese zwei Zeilen entfernen, funktioniert die App? Was ist die Geschichte hinter der Szene? thx – seph
Mein Verständnis ist, wenn PDF von Desktop-Anwendung herunterladen müssen Sie GET/POST angeben, aber in Android entscheidet, wie auf dem Antwortcode herunterladen. Daher ist diese Zeile nicht erforderlich. Auch der doOutput ist nicht erforderlich, da wir streamen und in die PDF-Datei schreiben. Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Danke, dass Sie es als beantwortet markiert haben. Haben Sie einen guten Tag. –