2012-12-10 81 views
1

我有多個圖像上傳與Android 3.x版本及以上版本的這個問題。我的應用程序是混合的,它不是純粹的Android。我必須使用Phonegap界面進行Android編碼。所以這裏是我使用AsyncTask編寫的代碼。對於Android 2.3而言,這同樣適用,但不適用於Android 3.x及更高版本。我正在分享我的代碼。使用Phonegap在Android中使用AsyncTask進行多圖像上傳

public class CFileUploader extends Plugin { 
    private String ACTION_POST_DATA = "cpost_data"; 
    private String CrLf = "\r\n"; 
    String base64Str=null; 

    @Override 
    public PluginResult execute(String arg0, JSONArray arg1, String arg2) { 
     Log.e("Sample App", " IN EXECUTE METHOD "); 

     PluginResult pluginResult = null; 
     if (ACTION_POST_DATA.equals(arg0)) { 
      try { 
       upload(arg1.getString(0), arg1.getString(1), arg1.getString(2), 
         arg1.getString(3), arg1.getString(4)); 

      } catch (JSONException jsonex) { 
       jsonex.printStackTrace(); 
      } 
     } 
     return pluginResult; 
    } 

    private PluginResult upload(String token, String date, String time, 
      String email, String fileNames) { 
     Log.e("Sample App", " IN UPLOAD METHOD "); 
     PluginResult pluginres = null; 

     final Data obje=new Data(token, date, time, email, fileNames); 

     CFileUploader.this.ctx.runOnUiThread(new Runnable(){ 
      public void run(){ 
       MyImageTask mTask=new MyImageTask(); 
       mTask.execute(obje); 
      } 
     }); 

     return pluginres; 
    } 

    class Data { 
     String token, date, time, email, fileNames; 
     Data(String token, String date, String time, String email, String fileNames){ 
      this.token=token; 
      this.date=date; 
      this.time=time; 
      this.email=email; 
      this.fileNames=fileNames; 
     } 

    } 

    private class MyImageTask extends AsyncTask<Data, String, String>{ 

     @Override 
     protected String doInBackground(Data... params) {    
      HttpURLConnection conn = null; 
      DataOutputStream dos = null; 
      DataInputStream inStream = null; 
      ByteArrayOutputStream baos = null; 
      byte[] imgData = null; 
      String urlString = "https://www.sampledata.com/myapp/upload_snapshots.php"; 

      Log.e("Sample App", " token " + params[0].token + " " + "date " + params[0].date + " " 
        + " time " + params[0].time + " " + "email " + params[0].email); 
      Log.e("Sample App", " imgPath " + params[0].fileNames); 

      try { 
       URL url = new URL(urlString); 
       conn = (HttpURLConnection) url.openConnection(); 
       conn.setDoInput(true); 
       conn.setDoOutput(true); 
       conn.setUseCaches(false); 
       conn.setRequestMethod("POST"); 
       conn.setRequestProperty("Connection", "Keep-Alive"); 
       conn.setRequestProperty("Content-Type", 
         "multipart/form-data;boundary=---------------------------1177141514664"); 

       String msg = ""; 
       StringBuffer buffer = new StringBuffer(msg); 
       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"token\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append(params[0].token + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"date\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append(params[0].date + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"time\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append(params[0].time + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"MAX_FILE_SIZE\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append("100000000072000" + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"email\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append(params[0].email + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"appkey\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append("426C3A7D5992B838BAF1BD10594C920C" + CrLf); 

       buffer.append("-----------------------------1177141514664"); 
       buffer.append(CrLf); 
       buffer.append("Content-Disposition: form-data; name=\"method\";" 
         + CrLf); 
       buffer.append(CrLf); 
       buffer.append("upload.snapshots" + CrLf); 

       String msg1 = ""; 
       StringBuffer imgBuffer = new StringBuffer(msg1); 
       List<byte[]> byetsInfo = new ArrayList<byte[]>(); 
       ArrayList<String> filenames = new ArrayList<String>(); 
       try { 
        JSONObject jObj = new JSONObject(new String(params[0].fileNames)); 
        JSONArray jArray = jObj.getJSONArray("snapshot_images"); 
        String drPath = android.os.Environment 
          .getExternalStorageDirectory().toString(); 

        for (int i = 0; i < jArray.length(); i++) { 
         String img = jArray.getString(i); 
         Log.e("Sample app", " imageName " + img); 

         File f = new File(drPath + "/myapp_images/" + img); 
         Uri ur = Uri.fromFile(f); 
         filenames.add(img); 
         Bitmap bmp; 
         try { 
          bmp = Media.getBitmap(CFileUploader.this.cordova 
            .getActivity().getContentResolver(), ur); 
          baos = new ByteArrayOutputStream(); 
          bmp.compress(CompressFormat.JPEG, 90, baos); 

          imgData = baos.toByteArray(); 
          Log.e("Sample app", " img data size " + imgData.length); 

         } catch (FileNotFoundException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

         byetsInfo.add(imgData); 

        } 

       } catch (JSONException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 

       String msg3 = ""; 
       StringBuffer eofBuffer = new StringBuffer(msg3); 
       eofBuffer.append(CrLf); 
       eofBuffer.append("-----------------------------4664151417711--"); 
       eofBuffer.append(CrLf); 

       conn.setChunkedStreamingMode(0); 

       for (int i = 0; i < byetsInfo.size(); i++) { 
        dos = new DataOutputStream(conn.getOutputStream()); 

        imgBuffer.delete(0, imgBuffer.length()); 
        imgBuffer.append("-----------------------------4664151417711"); 
        imgBuffer.append(CrLf); 
        imgBuffer.append("Content-Disposition: form-data; name=\"snapshotUpload[]\"; filename=\"" 
          + filenames.get(i) + "\"" + CrLf); 
        imgBuffer.append("Content-Type: image/jpeg" + CrLf); 
        imgBuffer.append(CrLf); 

        dos.write(buffer.toString().getBytes()); 
        dos.write(imgBuffer.toString().getBytes()); 

        int index = 0; 
        int size = 1024; 
        do { 

         if ((index + size) < byetsInfo.get(i).length) { 
          size = byetsInfo.get(i).length - index; 
         } 
         dos.write(byetsInfo.get(i), index, size); 
         index += size; 
        } while (index < byetsInfo.get(i).length); 
        Log.e("file upload ", " written: " + index); 

        dos.write(eofBuffer.toString().getBytes()); 

       } 

       Log.e("Debug", "File is written"); 
       Log.e("activity upload demo ", 
         " in file upload " + conn.getResponseMessage()); 
       dos.flush(); 

      } catch (Exception ec) { 
       ec.printStackTrace(); 
      } 

      // Read the response 
      try { 
       inStream = new DataInputStream(conn.getInputStream()); 
       char buff = 512; 
       int len; 
       byte[] data = new byte[buff]; 
       do { 
        len = inStream.read(data); 
        if (len > 0) { 
         System.out.println(new String(data, 0, len)); 
         base64Str += new String(data, 0, len); 
         Log.e("Sample app", " " + new String(data, 0, len)); 
        } 
       } while (len > 0); 
       Log.e("file upload ", " DONE "); 

       dos.close(); 
       inStream.close(); 

      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 

      try { 
       if (conn.getResponseMessage().equalsIgnoreCase("OK")) { 
        return base64Str; 
       } else { 
        return null; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
     } 

    } 

} 

令牌,日期,時間,電子郵件和文件名我將從js文件中獲得。

我應該用這種相處一個base64字符串:

Submitted Requests: 
requests={"imageInfo":{"snapshotDateTime":"2012-12-09 22:38:14","snapshots":{"name":["Water lilies.jpg","Sunset.jpg"],"type":["image\/jpeg","image\/jpeg"],"tmp_name":["\/tmp\/phpXmZchs","\/tmp\/phpqylUgX"],"error":[0,0],"size":[83794,71189]}}} 

,我沒有得到任何一方的,當我運行的Android 3.x和上面這段代碼。

請糾正我,如果我錯了某處。謝謝很多。

+0

請詳細說明什麼是不工作。 Logcat輸出也會有所幫助 –

+0

@AnupCowkur我已經添加了詳細信息。請看看 – Lavanya

+0

我敢打賭,這個問題與'HttpUrlConnection'有關......我知道Honeycomb第一次出現時,針對該類的代碼做了若干特定於實現的更改。爲了調試這個問題,找出http連接的響應狀態(即'conn.getResponseStatus()'...它輸出了什麼?)。發佈這樣的東西給你的問題,也許我們可以進一步幫助。這似乎已經有很多問題了,所以你可能也想自己做一些谷歌搜索(也就是看最後一篇文章:http://stackoverflow.com/q/10058516/844882) –

回答

1

誰也回答非常感謝。經過一段時間的苦苦掙扎後,我終於找到了解決方案,並找到了一行正在做的事情。

conn.setChunkedStreamingMode(0); 

我已經刪除了上面的這一行,它在任何版本的設備上工作都很好。

0

我猜你試圖爲多個上傳啓動多個AsyncTasks。 您假定每個任務都創建了一個不同的線程,對於蜂窩版本而言,這是正確的,但在蜂窩上,後來AsyncTask的行爲已更改,Asynctask的所有實例都運行單個線程。 看一看這種方法對於真正的並行執行

executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.

+0

我只打一個電話,http連接也打一次。只有我發送的內容是多個。 – Lavanya

+0

這實際上是兩個SDK之間的差異,但它不應該在OP的情況下產生任何影響,因爲她從不執行兩個或更多'AsyncTask'的並行執行。 –