2017-08-20 5 views
0

JSで作成したcsvファイルをエクスポートして、電話でダウンロードできるようにしたいのですが、JSで作成したcsvファイルをAndroid携帯電話(webview)にダウンロードする方法

これは、ファイルを作成するための私のJSコードです:

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(); 

これは私のアンドロイドコードです:

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); 
      } 
     }); 
    } 

私はこのエラーを取得する:

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)

更新

私は同じエラーを取得し、私のAndroidManifest.xmlに以下を追加した場合:私は、私はこのようなJSでCSVにエクスポートする必要があるデータを生成してやった

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

は、PhoneGapの/コルドバのあなたが認識していることのWebViewでJavascriptとの間のブリッジハイブリッドアプリをすることができます:

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); } } 

これは、関数generateNoteOnSDですJavaのAndroid機能ですか? –

+0

はい私はそれが存在することを知っています。しかし、私はアンドロイドスタジオで完全に私のアプリを作成したので、コルドバに変更することは不可能です。 – Steven

+0

私はこのエラーが表示されます:Intent {act = android.intent.action.VIEWを処理するためのアクティビティが見つかりません – Steven

答えて

0

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); 
}; 

私が最後にしたことは、その文字列を記録することです。私はこのようなJavaコードでキャプチャしますまあこと:

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(); 
     } 
    } 
関連する問題