2014-10-06 26 views
0

對於初學者我是一個Android新手。我有一個android應用程序,將音頻記錄到原始文件中12秒,然後使用lame將其轉換爲最終文件「mezzo.mp3」。應用程序應該將文件上傳到服務器。但是,似乎代碼從不執行上傳部分。這是我的代碼。錄音和POST到服務器

MainActivity.java

class UploadFileTask extends AsyncTask<Void, Void, String> { 
     @Override 
     protected String doInBackground(Void... voids) { 
      String responseString = ""; 
      try { 
       String url = "http://178.62.209.46:8000/api/tag/"; 
       File track = new File(Environment.getExternalStorageDirectory(), "mezzo.mp3"); 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpPost httppost = new HttpPost(url); 
       MultipartEntityBuilder reqEntity = MultipartEntityBuilder.create(); 
       reqEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
       //InputStream inputStream = new ; 
       reqEntity.addBinaryBody("track", track); 
       final HttpEntity myEntity = reqEntity.build(); 
       httppost.setEntity(myEntity); 
       HttpResponse response = httpclient.execute(httppost); 
       //process response 
       responseString = new BasicResponseHandler().handleResponse(response); 

      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return responseString; 
     } 
     protected void onPostExecute(String responseString){ 
      Toast.makeText(getApplicationContext(), responseString, Toast.LENGTH_LONG).show(); 
     } 
    } 

,這裏是定時器和UploadFileTask調用:

Button startButton = (Button) findViewById(R.id.StartButton); 
     startButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mRecMicToMp3.start(); 
       CountDownTimer countDowntimer = new CountDownTimer(12000, 1000) { 
        public void onTick(long millisUntilFinished) { 
        } 

        public void onFinish() { 
         mRecMicToMp3.stop(); 
         Toast.makeText(getApplicationContext(), "Stopped recording Automatically ", Toast.LENGTH_LONG).show(); 

        }};countDowntimer.start(); 

      } 
     }); 
     new UploadFileTask().execute(); 

定時器運行好和 「停止錄製自動」 舉杯節目。但是,似乎new UploadFileTask().execute();從未運行。

我在做什麼錯?

+0

你的日誌顯示了什麼?你的清單中是否有互聯網許可?另外,你的意思是代碼永遠不會執行?哪部分停止工作? – erad 2014-10-06 11:21:37

+0

'Toast.makeText(getApplicationContext(),「Stopped recording Automatically」,Toast.LENGTH_LONG).show();'。你看到烤麪包了嗎? ' – greenapps 2014-10-06 11:47:16

+0

Toast在12秒後顯示,因爲它應該。 – Wedava 2014-10-07 23:13:20

回答

1

您發佈的代碼很多。你應該只發布相關的代碼。那在onClick就足夠了。

您有NetworkOnMainThreadException。這在LogCat中也會清晰可見。你必須把'互聯網代碼'放在AsyncTask或Thread中。

更新:嗯...我可能會很快與他們交談。老實說,我不知道'onFinish'中的代碼是否在主線程上執行。但是,如果吐司來臨,它是。請在LogCat中查找真正的錯誤。

+0

這是不夠logcat。我認爲還有更多值得看的地方。如果這個吐司來臨,你將有主線豁免網絡。而且你已經知道你必須做什麼了。 – greenapps 2014-10-08 04:49:11

+0

我更新了代碼以使用AsyncTask ...但是,它似乎不能執行。 – Wedava 2014-10-11 14:27:42

+0

從doInBackground中移除吐司。你不能在那裏使用吐司。改用Log.d()語句。你可以在onPostExecute中使用Toast來表示結束。 – greenapps 2014-10-11 14:31:42

1

你在安裝onclicklistener的時候開始了你的asynctask。所以甚至在用戶點擊之前。錄製完成後,您應該啓動它。在烘烤後直接放置該行,表明記錄已停止。