Wie öffne ich eine PDF-Datei, die entweder im Ordner „res/raw“ oder „assets“ gespeichert ist?
Lesezeit: 6 Minuten
Ich werde eine PDF-Datei in meiner Bewerbung anzeigen, und die PDF-Datei muss mit der Bewerbung gebündelt werden.
Was ist ein guter Weg, dies zu tun?
Ich habe gelesen, dass dies möglicherweise möglich ist, indem die PDF-Datei zu einem res/raw-Ordner hinzugefügt und von dort gelesen wird, aber ich erhalte Projektfehler, wenn ich die PDF-Datei dort ablege.
Also habe ich versucht, die PDF-Datei in den Asset-Ordner des Projekts zu legen, und es gab keine Fehler.
So habe ich versucht, das pdf anzuzeigen:
File pdfFile = new File("res/raw/file.pdf");
Uri path = Uri.fromFile(pdfFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(path, "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Irgendwelche Ideen oder Vorschläge?
Vielen Dank im Voraus
Deepak Sharma
Sie können die PDF-Datei nicht öffnen direkt von dem Vermögenswerte Ordner. Sie müssen zuerst die Datei aus dem Assets-Ordner auf die SD-Karte schreiben und dann von der SD-Karte lesen. Der Code lautet wie folgt: –
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
File fileBrochure = new File(Environment.getExternalStorageDirectory() + "https://stackoverflow.com/" + "abc.pdf");
if (!fileBrochure.exists())
{
CopyAssetsbrochure();
}
/** PDF reader code */
File file = new File(Environment.getExternalStorageDirectory() + "https://stackoverflow.com/" + "abc.pdf");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),"application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try
{
getApplicationContext().startActivity(intent);
}
catch (ActivityNotFoundException e)
{
Toast.makeText(SecondActivity.this, "NO Pdf Viewer", Toast.LENGTH_SHORT).show();
}
}
//method to write the PDFs file to sd card
private void CopyAssetsbrochure() {
AssetManager assetManager = getAssets();
String[] files = null;
try
{
files = assetManager.list("");
}
catch (IOException e)
{
Log.e("tag", e.getMessage());
}
for(int i=0; i<files.length; i++)
{
String fStr = files[i];
if(fStr.equalsIgnoreCase("abc.pdf"))
{
InputStream in = null;
OutputStream out = null;
try
{
in = assetManager.open(files[i]);
out = new FileOutputStream(Environment.getExternalStorageDirectory() + "https://stackoverflow.com/" + files[i]);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
break;
}
catch(Exception e)
{
Log.e("tag", e.getMessage());
}
}
}
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
Das ist alles..Viel Spaß!! und vergessen Sie bitte nicht, +1 zu geben. Danke
Wie Lint in der neuen Version empfiehlt. Nicht hartcodieren /sdcard/; benutzen Environment.getExternalStorageDirectory().getPath() stattdessen
– Marcel Bruder
12. März 13 um 23:38 Uhr
Environment.getExternalStorageDirectory().getPath() + „/“, damit dieses Beispiel funktioniert
– max4ever
18. April 14 um 11:03 Uhr
Wie lösche ich das PDF, nachdem der Benutzer es gelesen hat? Ich habe versucht, startActivityForResult zu verwenden, aber kein Glück
– max4ever
18. April 14 um 11:21 Uhr
Sie könnten es von zeigen raw/ oder assets/ ob Ihre Anwendung tatsächlich einen PDF-Reader implementiert hat. Da Sie möchten, dass es in einer separaten Anwendung (z. B. Adobe Reader) angezeigt wird, schlage ich Folgendes vor:
Speichern Sie die PDF-Datei im assets/ Verzeichnis.
Starte den Intent genau wie du es jetzt tust, außer verwenden getAbsolutePath() auf der neu erstellten Datei für die Daten des Intents.
Beachten Sie, dass ein Benutzer möglicherweise keine PDF-Leseanwendung hat. In diesem Fall ist es sinnvoll, die zu fangen ActivityNotFoundException und eine entsprechende Meldung anzeigen.
Sie können die des PackageManagers verwenden queryIntentActivities Methode, um zu überprüfen, ob eine Aktivität auf einen bestimmten Intent reagieren kann. Sehen Hier zum Beispiel
– David Snabel-Caunt
27. Juni 11 um 10:31 Uhr
@David Ich wusste, dass ich etwas vergessen habe! Danke, dass du das hinzugefügt hast.
– Felix
27. Juni 11 um 10:48 Uhr
🙂 Ich habe das Gefühl, dass Ihre Antwort die beste Lösung ist, es sei denn, externe Anwendungen können auf Paketressourcen zugreifen.
– David Snabel-Caunt
27. Juni 11 um 11:01 Uhr
David Snabel-Caunt
Ich habe das folgende Format verwendet, um Rohressourcen aus meiner eigenen Anwendung heraus zu öffnen. Ich habe nicht getestet, ob eine andere Anwendung Ihre Rohressource öffnen kann.
Uri path = Uri.parse("android.resource://" + getPackageName() + "https://stackoverflow.com/" + R.raw.myPdfName);
hmm, ich habe adobe reader auf meinem gerät installiert, aber ich erhalte eine ActivitynotFoundException. Irgendwelche Ideen?
– Ikky
27. Juni 11 um 10:47 Uhr
Entweder der URI oder der MIME-Typ (oder beides) kann nicht abgeglichen werden, leider weiß ich nicht, wie die Reader-Anwendung abgleicht. Möglicherweise müssen Sie es mit und ohne Angabe des MIME-Typs versuchen und versuchen, etwas von der SD-Karte zu öffnen, da es möglicherweise überhaupt nicht von Ihren Rohressourcen geöffnet wird.
– David Snabel-Caunt
27. Juni 11 um 10:56 Uhr
Snikola
Ihre PDF-Absicht scheint gut zu sein, aber Sie sollten dies versuchen, um den Uri der Datei im Rohordner zu erhalten:
Uri path = Uri.parse("android.resource://<you package>/raw/<you file.pdf>");