2012-07-09 50 views
1

我Downloader.java文件是java.lang.String中不能转换到JSON对象

package com.phonegap.plugins.downloader; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.util.Log; 

import com.phonegap.api.Plugin; 
import com.phonegap.api.PluginResult; 

public class Downloader extends Plugin { 

    @Override 
    public PluginResult execute(String action, JSONArray args, String callbackId) { 

     if (!action.equals("downloadFile")) 
      return new PluginResult(PluginResult.Status.INVALID_ACTION); 

     try { 

      String fileUrl = args.getString(0); 
      JSONObject params = args.getJSONObject(1); 

      String fileName = params.has("fileName") ? 
        params.getString("fileName"): 
        fileUrl.substring(fileUrl.lastIndexOf("/")+1); 

      String dirName = params.has("dirName") ? 
        params.getString("dirName"): 
        "sdcard/download"; 

      Boolean overwrite = params.has("overwrite") ? params.getBoolean("overwrite") : false; 

      return this.downloadUrl(fileUrl, dirName, fileName, overwrite, callbackId); 

     } catch (JSONException e) { 

      e.printStackTrace(); 
      return new PluginResult(PluginResult.Status.JSON_EXCEPTION, e.getMessage()); 

     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      return new PluginResult(PluginResult.Status.ERROR, e.getMessage()); 
     } 

    } 

    private PluginResult downloadUrl(String fileUrl, String dirName, String fileName, Boolean overwrite, String callbackId) throws InterruptedException, JSONException { 

     try { 

      Log.d("PhoneGapLog", "Downloading "+fileUrl + " into " + dirName + "/" + fileName); 

      File dir = new File(dirName); 
      if (!dir.exists()) { 
       Log.d("PhoneGapLog", "directory " + dirName + " created"); 
       dir.mkdirs(); 
      } 

      File file = new File(dirName, fileName); 

      if (!overwrite && file.exists()) { 
       Log.d("DownloaderPlugin", "File already exist"); 

       JSONObject obj = new JSONObject(); 
       obj.put("status", 1); 
       obj.put("total", 0); 
       obj.put("file", fileName); 
       obj.put("progress", 100); 

       return new PluginResult(PluginResult.Status.OK, obj); 
      } 

      URL url = new URL(fileUrl); 
      HttpURLConnection ucon = (HttpURLConnection) url.openConnection(); 
      ucon.setRequestMethod("GET"); 
      ucon.setDoOutput(true); 
      ucon.connect(); 

      Log.d("PhoneGapLog", "Download start"); 

      InputStream is = ucon.getInputStream(); 
      byte[] buffer = new byte[1024]; 
      int readed = 0, 
       progress = 0, 
       totalReaded = 0, 
       fileSize = ucon.getContentLength(); 

      FileOutputStream fos = new FileOutputStream(file); 

      while ((readed = is.read(buffer)) > 0) { 

       fos.write(buffer, 0, readed); 
       totalReaded += readed; 

       int newProgress = (int) (totalReaded*100/fileSize);    
       if (newProgress != progress) 
       progress = informProgress(fileSize, newProgress, fileName, callbackId); 

      } 

      fos.close(); 

      Log.d("PhoneGapLog", "Download finished"); 

      JSONObject obj = new JSONObject(); 
      obj.put("status", 1); 
      obj.put("total", fileSize); 
      obj.put("file", fileName); 
      obj.put("progress", progress); 

      return new PluginResult(PluginResult.Status.OK, obj); 

     } 
     catch (FileNotFoundException e) { 
      Log.d("PhoneGapLog", "File Not Found: " + e); 
      return new PluginResult(PluginResult.Status.ERROR, 404); 
     } 
     catch (IOException e) { 
      Log.d("PhoneGapLog", "Error: " + e); 
      return new PluginResult(PluginResult.Status.ERROR, e.getMessage()); 
     } 

    } 

    private int informProgress(int fileSize, int progress, String fileName, String callbackId) throws InterruptedException, JSONException { 

     JSONObject obj = new JSONObject(); 
     obj.put("status", 0); 
     obj.put("total", fileSize); 
     obj.put("file", fileName); 
     obj.put("progress", progress); 

     PluginResult res = new PluginResult(PluginResult.Status.OK, obj); 
     res.setKeepCallback(true); 
     success(res, callbackId); 

     //Give a chance for the progress to be sent to javascript 
     Thread.sleep(100); 

     return progress; 
    } 

} 

我downloader.js文件是

function Downloader() {} 

Downloader.prototype.downloadFile = function(fileUrl,dirName,fileName,overwrite,win,fail) { 

    //Make params hash optional. 
    if (!fail) win = params; 
    PhoneGap.exec(win, fail, "Downloader", "downloadFile", [fileUrl, dirName,fileName,overwrite]); 
}; 

PhoneGap.addConstructor(function() { 
    PhoneGap.addPlugin("downloader", new Downloader()); 
    PluginManager.addService("Downloader", "com.phonegap.plugins.downloader.Downloader"); 
}); 

和main.js文件是

function downloadfile() { 
    window.plugins.downloader.downloadFile("c:/Users/460725/Desktop/NIACustomerPhase.pdf","sdcard/cache/","NIACustomerPhase.pdf", false, 
      function(data){ 
      if(data=="exist"){ 
      alert("File already exist"); 
      } 
      else{ 
      alert("File saved on sd card") 
      } 
      },function(data){ alert("error: "+data); }); 

} 

我有这个集成到android phonegap project.But当我运行该项目,我得到Ale rt错误:值的SD卡/缓存/在1类型java.lang.String canno T为转换成JSON对象谁能告诉这可能是提前problem..Thanks ..


我已经取代了与以往相同的代码,同时也改变了我的url.Now文件main.js是

function downloadfile() { 

    window.plugins.downloader.downloadFile("http://www.toforge.com/archive.zip","sdcard/cache/","archive.zip", false, 
      function(data){ 
      if(data=="exist"){ 
      alert("File already exist"); 
      } 
      else{ 
      alert("File saved on sd card"); 
      } 
      },function(data){ alert("error: "+data); }); 

} 

现在我得到,当我点击下载文件链接无法解析主机 “www.toforge.com”错误警报:没有与主机名关联的地址任何人可以帮助我解决这个错误??在此先感谢..

+1

尝试捕捉你正试图转换成JSONObject的字符串,并检查其是否有效的JSON或不http://jsonlint.com/ – Akram 2012-07-09 10:48:38

+0

使用'Log.v(字符串,字符串)'调试问题......也就是说,用日志丢弃代码并检查以确保在进程中的每个步骤都将正确的输出写入logcat。 – 2012-07-09 14:33:32

回答

2

您正在传递从Javascript的字符串数组,但然后试图将其中一个值转换为JSON这是不可能的。

下面将工作替换当前的功能:

Downloader.prototype.downloadFile = function(fileUrl,dirName,fileName,overwrite,win,fail) 
{ 
    //Make params hash optional. 
    if (!fail) win = params; 
    PhoneGap.exec(win, fail, "Downloader", "downloadFile", [fileUrl, {dirName: dirName, fileName: fileName, overwrite: overwrite} ]); 
}; 

虽然你的代码仍然没有c:/Users/460725/Desktop/NIACustomerPhase.pdf工作是不是一个有效的URL,它为Windows文件系统路径。

when i am changin access origin then i am getting an alert popup **download errorhttp://www.irs.gov/pub/irs-pdf/fw4.pdf ** with lots of errors..I am attaching image with this comment..can you please detect why these errors are coming?

相关问题