2017-08-20 5 views
0

Je veux exporter un fichier csv créé dans JS et laisser les gens le télécharger sur leur téléphone.Comment télécharger un fichier csv créé dans JS sur votre téléphone Android (webview)

Ceci est mon code JS pour la création du fichier:

var createACSVFile = function() { 
    var ArrayOfDataToExport = []; 
    for (var k = 0; k < localStorage.length; k++) { 
     console.log([localStorage.key(k),JSON.parse(localStorage.getItem(localStorage.key(k)))]); 
     ArrayOfDataToExport.push([localStorage.key(k),JSON.parse(localStorage.getItem(localStorage.key(k)))]) 
    } 


    var csvRows = []; 

    for(var i=0, l=ArrayOfDataToExport.length; i<l; ++i){ 
     csvRows.push(ArrayOfDataToExport[i].join(',')); 
    } 

    var csvString = csvRows.join("%0A"); 
    var a   = document.createElement('a'); 
    a.href  = 'data:attachment/csv,' + csvString; 
    a.target  = '_blank'; 
    a.download = 'exportFile.csv'; 

    document.body.appendChild(a); 
    a.click(); 
}; 

createACSVFile(); 

Ceci est mon code Android:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     view = (WebView) this.findViewById(R.id.webView); 
     view.getSettings().setJavaScriptEnabled(true); 
     view.getSettings().setAllowFileAccess(true); 
     view.getSettings().setDomStorageEnabled(true); 
     view.getSettings().setUseWideViewPort(true); 
     view.getSettings().setLoadWithOverviewMode(true); 
     view.setInitialScale(1); 
     view.getSettings().setJavaScriptEnabled(true); 
     view.getSettings().setSupportZoom(false); 
     view.setWebViewClient(new MyBrowser(){ 

      @Override 
      public void onPageFinished(WebView view, String url) { 
      //hide loading image 
      findViewById(R.id.imageLoading1).setVisibility(View.GONE); 
      //show webview 
      findViewById(R.id.webView).setVisibility(View.VISIBLE); 
     } 


     }); 
     view.loadUrl("file:///android_asset/www/index.html"); 
     view.setWebChromeClient(new WebChromeClient(){ 
}); 
     view.setDownloadListener(new DownloadListener() { 
      public void onDownloadStart(String url, String userAgent, 
             String contentDisposition, String mimetype, 
             long contentLength) { 
       Intent i = new Intent(Intent.ACTION_VIEW); 
       i.setData(Uri.parse(url)); 
       startActivity(i); 
      } 
     }); 
    } 

Je reçois cette erreur:

08-20 11:12:36.508 17111-17111/checker.coin.crypto.wingcrony.by.cryptocoinchecker E/AndroidRuntime: FATAL EXCEPTION: main Process: checker.coin.crypto.wingcrony.by.cryptocoinchecker, PID: 17111 android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=data:attachment/csv,Poloniex, currencyForToShow,usd howToOrder,Shortname passS,false whichExchangeYouUse,Bitfinex } at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523) at android.app.Activity.startActivityForResult(Activity.java:3981) at android.app.Activity.startActivityForResult(Activity.java:3933) at android.app.Activity.startActivity(Activity.java:4272) at android.app.Activity.startActivity(Activity.java:4240) at checker.coin.crypto.wingcrony.by.cryptocoinchecker.MainActivity$3.onDownloadStart(MainActivity.java:153) at com.android.webview.chromium.WebViewContentsClientAdapter.onDownloadStart(WebViewContentsClientAdapter.java:1195) at org.chromium.android_webview.AwContentsClientCallbackHelper$MyHandler.handleMessage(AwContentsClientCallbackHelper.java:126) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5728) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

Mise à jour

Si ajouter à mon AndroidManifest.xml je reçois la même erreur:

<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/> 
+0

Connaissez-vous Phonegap/Cordova qui permet des applications hybrides pont entre Javascript dans WebView et Fonctionnalité Java Android? –

+0

Oui, je sais que ça existe. Mais j'ai créé mon application complètement dans le studio Android, donc il est impossible de passer à Cordova. – Steven

+0

Je reçois cette erreur: Aucune activité trouvée pour gérer Intent {act = android.intent.action.VIEW Je ne sais pas comment résoudre cela – Steven

Répondre

0

Ce que je ne faisais que je produis les données que je dois exporter au format CSV dans les JS comme ceci:

var generateTheDataToExportToArrayString = function() { 
    var ArrayOfDataToExport = []; 
    for (var k = 0; k < localStorage.length; k++) { 
     var keyName = (localStorage.key(k)); 
     var data = JSON.parse(localStorage.getItem(localStorage.key(k))); 
} 
    var String = '['; 
    for (var i = 0; i < ArrayOfDataToExport.length; i++){ 
     if (typeof ArrayOfDataToExport[i][1] === "object"){ 
      String += "[" + ArrayOfDataToExport[i][0] + ","; 
      if (ArrayOfDataToExport[i][1].length > 1 || ArrayOfDataToExport[i][1].length === 0){ 
       if (ArrayOfDataToExport[i][1].length === 0){ 
        String += '[' + '' + ']]'; 
       } 
       else { 
        for (var k = 0; k < ArrayOfDataToExport[i][1].length; k++){ 
         String += '['; 
         for (var l = 0; l < ArrayOfDataToExport[i][1][k].length - 1; l++){ 
          String += ArrayOfDataToExport[i][1][k][l]+ ","; 
         } 

         String += ArrayOfDataToExport[i][1][k][ArrayOfDataToExport[i][1][k].length - 1] + "],"; 
        } 
        String = String.slice(0, -1); 
        String += "],"; 
       } 
      } 
      else { 
       String += "["; 
       for (var j = 0; j < ArrayOfDataToExport[i][1].length - 2; j++){ 
        String += ArrayOfDataToExport[i][1][j] + ","; 
       } 
       String += ArrayOfDataToExport[i][1][ArrayOfDataToExport[i][1].length - 1] + "]],"; 
      } 
     } 
     else { 
      String += "[" + ArrayOfDataToExport[i][0] + ","; 
      String += ArrayOfDataToExport[i][1] + "],"; 
     } 

    } 
    String = String.slice(0, -1); 
    String += "]"; 
    console.log(String); 
}; 

Vous dites que la dernière chose que je fais est d'enregistrer cette chaîne. Bien que je capturer dans le code Java comme ceci:

public void onConsoleMessage(String message, int lineNumber, String sourceID) { 
       if (sourceID.equals("file:///android_asset/www/assets/js/parseTest.js") && lineNumber == 184){ 
        generateNoteOnSD(getBaseContext(),"export.csv", message); 
       } 
      } 

Ceci est la fonction generateNoteOnSD:

public void generateNoteOnSD(Context context, String sFileName, String sBody) { 
     try { 
      File root = new File(Environment.getExternalStorageDirectory(), "Backup_Data_For_AltFolio"); 
      if (!root.exists()) { 
       root.mkdirs(); 
      } 
      File gpxfile = new File(root, sFileName); 
      FileWriter writer = new FileWriter(gpxfile); 
      writer.append(sBody); 
      writer.flush(); 
      writer.close(); 
      Toast.makeText(context, "Saved", Toast.LENGTH_SHORT).show(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }