Autore Topic: Problema webview download PDF  (Letto 2678 volte)

Offline Hutzee

  • Nuovo arrivato
  • *
  • Post: 17
  • cuz we luv teh lulz <<-<
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s2
  • Sistema operativo:
    backtrack 5r3 (ubuntu 10.04)
Problema webview download PDF
« il: 26 Febbraio 2013, 12:49:56 CET »
0
Salve,
ho cercato in giro per il web su stackoverflow, qui su anddev, su altri forum e altri siti, ma soluzioni al mio problema non ne ho trovate.
Io ho una webview come app in cui in una certa pagina, ho un form html che richiede 3 campi, i quali dopo aver inviato il form vengono controllati da un file php che SE li ritiene corretti da come risultato il download di un file pdf in cui vengono mostrati i suddetti dati.
Come forse chi leggerà questo post saprà, in una webview se si desidera aprire un pdf nell'app o anche scaricarlo in un qualsiasi modo è un pò un casino; esistono vari modi per scaricarlo ma nessuno risolve il mio.

Io ho provato a inserire questo codice
Codice (Java): [Seleziona]
        WorfutWeb.setDownloadListener(new DownloadListener() {      
        public void onDownloadStart(String url, String userAgent,  String contentDisposition, String mimetype,  long contentLength) {      
            Log.e("on", url);
            WorfutWeb.getSettings().setJavaScriptEnabled(true);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.setType("application/pdf");
            intent.setData(Uri.parse(url));          
            startActivity(intent);      
        }     });

Dove "WorfutWeb" è la mia webview, e per funzionare più o meno funziona, nel momento in cui ho compilato il form e clicco il pulsante di submit, mi redirige (come da form (action="nomefile.php")) al file che analizza i dati e mi fa scaricare il pdf, il problema è che nel momento in cui clicco, mi apre  nel browser la pagina richiesta nomefile.php ma (secondo me) non analizza neanche i file inviati, e quindi mi restituisce questa pagina "nomefile.php" bianca e vuota, senza scaricare nessun file pdf.

Come posso risolvere?
Grazie mille a tutti!

Offline ligio

  • Nuovo arrivato
  • *
  • Post: 24
  • Respect: +1
    • Mostra profilo
    • Ligio Blog
  • Dispositivo Android:
    htc wildfire, ZT180 v2
  • Play Store ID:
    Marco Lijoi
  • Sistema operativo:
    Windows Vista
Re:Problema webview download PDF
« Risposta #1 il: 26 Febbraio 2013, 15:12:53 CET »
0
Ciao!
Ho guardato il codice che hai scritto e secondo me non dovresti utilizzare un Intent.
L'Intent che hai scritto ti serve per visualizzare il pdf DOPO averlo scaricato!

Per scaricare il pdf invece dovresti utilizzare una funzione JAVA di download di uno stream binario ( prova a cercare "download binary file with java" su Google oppure guarda l'ultima risposta di questa discussione )

Lo script nomefile.php deve poi restituirti il PDF stesso e non una pagina html vuota!


ciaooooo

Offline Hutzee

  • Nuovo arrivato
  • *
  • Post: 17
  • cuz we luv teh lulz <<-<
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s2
  • Sistema operativo:
    backtrack 5r3 (ubuntu 10.04)
Re:Problema webview download PDF
« Risposta #2 il: 27 Febbraio 2013, 09:29:48 CET »
0
Il problema è che ogni codice che vedo al suo interno ha già il nome del file, mentre il mio viene creato DOPO aver controllato il form inviato via php, in poche parole io nel mio file finale php dove va a finire il form ho un sistema di librerie in php che va ad inserire una pagina html creata dinamicamente dentro un pdf, la trasforma (infatti ho usato "html to pdf"). Ma come dico in java, prima esegui il form poi se ti arriva in risposta il download di un file pdf tu scaricalo..????
volendo potrei linkarlo per far capire, ma non vorrei fosse considerato spam, quindi attendo..

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema webview download PDF
« Risposta #3 il: 27 Febbraio 2013, 09:47:33 CET »
0
io non sto capendo, normalmente in un browser ( e la webview simula il browser) se tu apri una pagina php,html o chi per essa che ti risponde con un file (quindi con un byte[]) il browser automaticamente chiede cosa fare (i browser desktop), oppure scarica nella cartella di default, con il nome impostato nell'header della risposta, il file.
In android se apri una pagina che ti genera un file, ti viene salvato il file nella cartella di default. Non capisco perchè non puoi usare questo metodo. Se proprio, ti metti in ascolto sui download e guardi quelli nuovi.
Non ho mai sviluppato niente a riguardo su android, ma avendo fatto cose analoghe lato web/desktop non credo sia impossibile, no?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Hutzee

  • Nuovo arrivato
  • *
  • Post: 17
  • cuz we luv teh lulz <<-<
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s2
  • Sistema operativo:
    backtrack 5r3 (ubuntu 10.04)
Re:Problema webview download PDF
« Risposta #4 il: 27 Febbraio 2013, 10:14:52 CET »
0
Guarda,
questo è il mio codice:
Codice (Java): [Seleziona]
package com.worfut.project;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;
import android.widget.FrameLayout.LayoutParams;
import android.view.KeyEvent;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuInflater;
import android.view.Window;

@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {

       
        WebView WorfutWeb;
        ProgressDialog progressBar;
       
            @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return true;
}

       

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

                this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
                this.getWindow().setGravity(Gravity.CENTER);
        setContentView(R.layout.main);
        final Activity activity = this;
     
        WorfutWeb = (WebView) findViewById(R.id.mainWebView);
       
        WorfutWeb.getSettings().setSupportZoom(false);
        WorfutWeb.getSettings().setBuiltInZoomControls(false);
        WorfutWeb.setBackgroundColor(Color.BLACK);
       
        WorfutWeb.setWebViewClient(new myWebClient());
        WorfutWeb.getSettings().setJavaScriptEnabled(true);
                        // prepare for a progress bar dialog
                        progressBar = new ProgressDialog(this, R.id.mainWebView);
                        progressBar.setCancelable(true);
                        progressBar.setIndeterminate(false);
            // Setting progressBar at the center of the screen
            Window window = progressBar.getWindow();
            window.setGravity(Gravity.CENTER);
            window.setLayout(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
            progressBar.setTitle("Worfut Project");
                        progressBar.setMessage("Caricamento in corso..");
                        progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                        progressBar.setProgress(0);
                        progressBar.setMax(100);
                        progressBar.show();  
                        WorfutWeb.setWebChromeClient(new WebChromeClient() {
                public void onProgressChanged(WebView view, final int progress)
                {
                    activity.setProgress(progress * 100);
                    progressBar.setProgress(progress);

                    if(progress == 100)
                    {
                        progressBar.dismiss();
                    }

                }
            });
        WorfutWeb.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl)
            {
       String html1 = "<html><body><br>";
       String html2 = "<div style='background: #007ac1; border: 2px solid lightblue; border-radius: 8px; padding: 4px;'>";
       String html3 = "<p style='font-weight: bolder;color: white;'><h2><u>Si &egrave; verificato un errore!</u></h3><br>";
       String html4 = "Possibili cause:<br><ul><li>";
       String html5 = "Non si dispone di una connessione Internet;</li><ul><li>Chiudere l'applicazione</li><li>Attivare la connessione Internet</li><li>Riavviare l'applicazione</li></ul><li>L'applicazione non risponde<ul><li>Chiudere e riaprire l'applicazione</li><li>Scriveteci sul Market Android</li></ul>";
       String html6 = "</li></ul></p><br><p align=right><font color=white><em>Worfut Staff.</em>&nbsp;</font></p></div></body></html>";
       String mime = "text/html";
       String encoding = "utf-8";
       view.loadData(html1+html2+html3+html4+html5+html6, mime, encoding);
            }
           
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                view.loadUrl(url);
                        if(url.endsWith("coupon.php")){
                    Uri uri = Uri.parse(url.toString());
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(browserIntent);
                    return true;
               }
                return true;

            }
        });
        WorfutWeb.loadUrl("http://www.americantrip.altervista.org/try");
    }
   
       
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
       
    switch (item.getItemId()) {
        case R.id.menu_about:  
        WorfutWeb.loadUrl("http://americantrip.altervista.org/try/info.php");
// inside the menu button you don't need to call Super.loadUrl, LoadUrl its enough
            return true;
        case R.id.menu_help:
                        progressBar.show();  
        WorfutWeb.loadUrl("http://americantrip.altervista.org/try/help.php");
// inside the menu button you don't need to call Super.loadUrl, LoadUrl its enough
            return true;
        case R.id.menu_search:
                        progressBar.show();  
        WorfutWeb.loadUrl("http://americantrip.altervista.org/try/cerca.php");
                return true;
            case R.id.menu_exit:
                Animation fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fadein);
                WorfutWeb.startAnimation(fadeInAnimation);
           finish();
        default:
            return super.onOptionsItemSelected(item);
    }
}
   
    public void onResume() {  
       super.onResume();  
       if (WorfutWeb != null) {  
        WorfutWeb.resumeTimers();  
       }  
     }  
 
    public void onPause() {  
       super.onPause();  
       if (WorfutWeb != null) {  
        WorfutWeb.pauseTimers();  
       }  
     }  
   
   
    public class myWebClient extends WebViewClient
    {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
                // TODO Auto-generated method stub
                super.onPageStarted(view, url, favicon);
        }
       
        @Override
        public void onPageFinished(WebView view, String url) {
                // TODO Auto-generated method stub
                super.onPageFinished(view, url);
                progressBar.dismiss();
        }
    }
   
     // To handle "Back" kewy press event for WebView to go back to previous screen.
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)
        {
                if ((keyCode == KeyEvent.KEYCODE_BACK) && WorfutWeb.canGoBack()) {
                        WorfutWeb.goBack();
                        return true;
                }
                return super.onKeyDown(keyCode, event);
        }
}

Io ho inserito questo per scaricare i file che provengono dal link "coupon.php"
Codice (Java): [Seleziona]
  @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url)
            {
                view.loadUrl(url);
                        if(url.endsWith("coupon.php")){
                    Uri uri = Uri.parse(url.toString());
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(browserIntent);
                    return true;
               }
                return true;
            }

E, per farti capire questo è il link > Worfut Project - Sito web ufficiale!
compila con dati falsi non è un problema, basta che la mail abbia la chiocciola e il punto anche se non esiste. Poi ti si aprirà il coupon che altro non è che un biglietto pdf.
Ora nella mia app non me la scarica, e non ho la minima idea di cosa scrivere!!!!
Ho davvero provato infiniti modi!

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema webview download PDF
« Risposta #5 il: 27 Febbraio 2013, 11:59:49 CET »
0
prova a togliere il tuo overrideurl loading
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Hutzee

  • Nuovo arrivato
  • *
  • Post: 17
  • cuz we luv teh lulz <<-<
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s2
  • Sistema operativo:
    backtrack 5r3 (ubuntu 10.04)
Re:Problema webview download PDF
« Risposta #6 il: 27 Febbraio 2013, 13:14:05 CET »
0
posso anche farlo ma di default la webview di android non va a scaricare alcun pdf

edit: modificato e non è cambiato nulla, clicco il bottone, al database viene aggiunto il dato, ma non mi scarica il file pdf!
« Ultima modifica: 27 Febbraio 2013, 13:29:15 CET da Hutzee, Reason: effettuata modifica suggerita »

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema webview download PDF
« Risposta #7 il: 27 Febbraio 2013, 15:23:53 CET »
0
quale database??
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Hutzee

  • Nuovo arrivato
  • *
  • Post: 17
  • cuz we luv teh lulz <<-<
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s2
  • Sistema operativo:
    backtrack 5r3 (ubuntu 10.04)
Re:Problema webview download PDF
« Risposta #8 il: 27 Febbraio 2013, 22:46:10 CET »
0
del sito cui fa riferimento la webview.. mysql.

Offline z4a007

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 10.1
  • Sistema operativo:
    Fedora 19
Re:Problema webview download PDF
« Risposta #9 il: 12 Settembre 2013, 12:12:51 CEST »
0
Ciao a tutti

Ho appena iniziato a sviluppare in Android ed ho il medesimo esatto problema

Io ho una sessione PHP attiva dopo l'autenticazione dell'utente e facendo click su un link (che è all'interno della pagina web esterna) lo script dal server mi manda un file PHP generato "al volo"

Funziona perfettamente sui browser dei PC (e anche nel browser Android DOPO l'autenticazione) ma NON dalla mia app che utilizza la webView

Tu hai risolto questo problema?

Se si mi daresti qualche indicazione su quale strada percorrere?

Grazie mille e ciao a tutti

Alessandro

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline z4a007

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Tab 10.1
  • Sistema operativo:
    Fedora 19
Re:Problema webview download PDF
« Risposta #11 il: 13 Settembre 2013, 08:32:04 CEST »
0
Ciao e grazie per il link, in realtà lo avevo già visto e questo non risolve.

Ho invece risolto scrivendo una classe di override del DownloadListener e il file viene slavato correttamente senza usicre dall'app

Poi ho aggiunto un intent che esegue l'apertura automatica del file scaricato e se non è disponibile mostra un Toast con l'indicazione del caso

Ora mi resta solo da verificare per quale motivo il file risultante risulta danneggiato

Vedo di fare qualche logcat e scoprire l'arcano vioso che la dimensione risulta corretta

Ciao a tutti

Alessandr