1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

PDF runterladen und via Intent öffnen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von mkl, 25.03.2012.

  1. mkl, 25.03.2012 #1
    mkl

    mkl Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    316
    Erhaltene Danke:
    33
    Registriert seit:
    09.01.2011
    Hi Leute,

    dieses Thema gibts glaube ich schon öfters zum. hat meine Suche schon das ein oder andere gefunden... Es gibt ein paar Beispiele im Netz wie man Bilder runterlädt aber zu PDF finde ich einfach nix...

    Ich möchte eine PDF Datei aus dem Internet herunterladen und gezielt in einem Ordner /sdcard/pdfs/ abspeichern. Wenn das speichern fertig ist, soll diese PDF mittels Intent -> PDF Viewer geöffnet werden.

    folgendes hab ich bisher aus dutzenden Quellen zusammengefrickelt:

    Code:
    DownloadManager mydl;
                    
                    mydl = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                    Uri myuri = Uri.parse(filepfad);
                    DownloadManager.Request request = new DownloadManager.Request(myuri);
                                                    
                    File file = new File("/sdcard/pdfs/UL13.pdf");
                    Uri path = Uri.fromFile(file);
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.setDataAndType(path, "application/pdf");
                    startActivity(intent);
    
    Der Dateipfad ist derzeit noch "hartgecoded" weil ich prüfen wollte ob der Intent funktioniert. Das funktioniert soweit wunderbar! Nur herunterladen tut er mir nichts zum. seh ich in der Statusleiste keinen Download... Außerdem frage ich mich wie ich den Zielpfad angeben kann...

    Wäre nett wenn ihr mir helfen könntet.
     
  2. Neeldarax, 26.03.2012 #2
    Neeldarax

    Neeldarax Erfahrener Benutzer

    Beiträge:
    170
    Erhaltene Danke:
    31
    Registriert seit:
    07.12.2010
    Hi mkl,

    Code:
    request.setShowRunningNotification(true);
    das sollte helfen :)

    Und danach warten bis DL fertig ist und lokalen Pfad finden:
    Code:
    BroadcastReceiver receiver = new BroadcastReceiver() {
    	@Override
    	public void onReceive(Context context, Intent intent) {
    		String action = intent.getAction();
    		if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
    			long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
    			Query query = new Query();
    			query.setFilterById(downloadId);
    			Cursor cursor = downloadManager.query(query);
    			if (cursor.moveToFirst()) {
    			   do {
    				int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
    				if (DownloadManager.STATUS_SUCCESSFUL == cursor.getInt(columnIndex)) {
    					Intent intentToOpen = new Intent(Intent.ACTION_VIEW);
    					intentToOpen.setDataAndType(Uri.parse(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))), MimeTypeMap.getSingleton().getMimeTypeFromExtension("apk"));
    
    					activity.startActivityForResult(intentToOpen,DeviceInfo.UPDATE_ACTIVITY_ID);
    					}
    				} while (cursor.moveToNext());
    
    				cursor.close();
    			}
    		}
    	}
    };
    
    activity.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    Hier habe ich eine APK runtergeladen und dann zum Installieren gestartet.
    Der Teil mit der Suche.. da muss man ab und zu den DL-Ordner leeren ^^

    regards
     
  3. mkl, 26.03.2012 #3
    mkl

    mkl Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    316
    Erhaltene Danke:
    33
    Registriert seit:
    09.01.2011
    Erstma recht vielen Dank für eine Hilfe :thumbsup:

    Folgende Probleme hab ich noch:

    Code:
    @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch(item.getItemId())
            {
                case R.id.erneuern:
                    
                    // Workaround für Kalenderwoche
                    TimeZone tz = TimeZone.getTimeZone("GMT+1");
                    Locale loc = Locale.GERMANY;
                    Calendar cal = Calendar.getInstance(tz,loc);
                    cal.setFirstDayOfWeek(Calendar.MONDAY);
                    int week = cal.get(Calendar.WEEK_OF_YEAR);
                    
                    // Aktuellen Downloadpfad ermitteln
                    String filepfad = pfad + String.valueOf(week) + ".pdf";      
                    
                    final DownloadManager mydl;                
                    mydl = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                    Uri myuri = Uri.parse(filepfad);
                    DownloadManager.Request request = new DownloadManager.Request(myuri);
                    
                    request.setShowRunningNotification(true);
                    
                    BroadcastReceiver receiver = new BroadcastReceiver() {
                        @Override
                        public void onReceive(Context context, Intent intent) {
                            String action = intent.getAction();
                            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                                long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                                Query query = new Query();
                                query.setFilterById(downloadId);
                                Cursor cursor = mydl.query(query);
                                if (cursor.moveToFirst()) {
                                   do {
                                    int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
                                    if (DownloadManager.STATUS_SUCCESSFUL == cursor.getInt(columnIndex)) {
                                        Intent intentToOpen = new Intent(Intent.ACTION_VIEW);
                                        intentToOpen.setDataAndType(Uri.parse(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))), MimeTypeMap.getSingleton().getMimeTypeFromExtension("apk"));
    
                                        Main.startActivityForResult(intentToOpen,DeviceInfo.UPDATE_ACTIVITY_ID);
                                        }
                                    } while (cursor.moveToNext());
    
                                    cursor.close();
                                }
                            }
                        }
                    };
                    
                    Main.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
                    
                    /*File file = new File("/sdcard/pdfs/UL13.pdf");
                    Uri path = Uri.fromFile(file);
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.setDataAndType(path, "application/pdf");
                    startActivity(intent);*/
                    
                    
                default:
                
                    return super.onOptionsItemSelected(item);
                
            }
    
    Folgende Fehler hab ich noch:

    In der Zeile:
    Main.startActivityForResult(intentToOpen,DeviceInfo.UPDATE_ACTIVITY_ID);

    DeviceInfo cannot be resolved to a variable

    Muss ich hier einfach irg. eine Integer Variable anlegen oder was muss beachtet werden?

    In der Zeile:
    Main.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

    Cannot make a static reference to the non-static method registerReceiver(BroadcastReceiver, IntentFilter) from the type ContextWrapper
     
  4. swordi, 26.03.2012 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    Java lernen hilft weiter :)

    Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
     
    Neeldarax bedankt sich.
  5. Neeldarax, 27.03.2012 #5
    Neeldarax

    Neeldarax Erfahrener Benutzer

    Beiträge:
    170
    Erhaltene Danke:
    31
    Registriert seit:
    07.12.2010
    Jop :)
    DeviceInfo ist eine Klasse mit der statischen int Variable.


    Da hat Swordi schon recht. Vllt. googlest du nach Instanzenmethoden und Klassenmethoden.

    registerReceiver ist eine Methode der Instanz und nicht der Klasse. Daher kein statischer Zugriff möglich.

    Hoffe ich konnte weiterhelfen.

    regards
     
  6. mkl, 27.03.2012 #6
    mkl

    mkl Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    316
    Erhaltene Danke:
    33
    Registriert seit:
    09.01.2011
    Mhhh ich meine klar kenne ich den Unterschied zwischen allgemeinen Methoden und Instanzabhängigen Methoden aber irg. ist das ganze in Java viel stranger als in C++... Außerdem finde ich es sehr erschwerend wenn ich für einen einfachen Download immer 10 Zeilen Code brauche?!? Wozu zum Beispiel benötige ich den Cursor?

    Könnt ihr mir eine möglichst deutsche Seite empfehlen wo ein solches Beispiel 1zu1 durchgespielt wird? Ich finde auf der developer.android.com seite irg. nur Referenzen und keine vernüftigen Samples...
     
  7. mkl, 28.03.2012 #7
    mkl

    mkl Threadstarter Fortgeschrittenes Mitglied

    Beiträge:
    316
    Erhaltene Danke:
    33
    Registriert seit:
    09.01.2011
    Also ich hab den Download nun geschafft :) War nur eine Frage der richtigen Positionierung ;) Nun noch ne Frage ich finde nun den Download wenn ich unter Downloads (App) im Appdrawer gehe. Im Verzeichnis sdcard/Download/ ist jedoch nichts... Wie kann ich denn die File dort hin kopieren? Bzw. wo finde ich die Dateien?
     

Diese Seite empfehlen