2012-08-26 47 views
2

嗨Iam做一个android应用程序,其中IAM上传视频到PHP服务器。
Iam使用HTTPURLConnection做上传。 Iam在通知区域显示进度条并更新它。
荫差不多一周搜索做this.But不能得到hint.Please帮助我,如果有人知道:如何在通知区域显示进度条?

我的代码:

HttpURLConnection conn = null; 
     DataOutputStream dos = null; 
     DataInputStream inStream = null; 
     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 
     int bytesRead; 
     byte[] buffer; 
     String urlString = "http://xxxxx/My_path.php"; 
     try { 
      long total = 0; 
      int count = 0; 
      // ------------------ CLIENT REQUEST 
      UUID uniqueKey = UUID.randomUUID(); 
      fname = uniqueKey.toString(); 
      Log.e("UNIQUE NAME", fname); 
      FileInputStream fileInputStream = new FileInputStream(
        new File(selectedPath)); 
      URL url = new URL(urlString);      
      conn = (HttpURLConnection) url.openConnection(); 
      int length=selectedPath.length(); 
      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=" + boundary); 
      dos = new DataOutputStream(conn.getOutputStream()); 
      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" 
        + fname + "" + lineEnd); 
      dos.writeBytes(lineEnd); 
      buffer = new byte[8192]; 
      bytesRead = 0; 
      while ((bytesRead = fileInputStream.read(buffer)) > 0) {         
       dos.write(buffer, 0, bytesRead);      
      }   
      dos.writeBytes(lineEnd); 
      dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);   
      Log.e("Debug", "File is written"); 
      fileInputStream.close(); 
      dos.flush(); 
      dos.close(); 

     } catch (MalformedURLException ex) { 
      Log.e("Debug", "error: " + ex.getMessage(), ex); 
     } catch (IOException ioe) { 
      Log.e("Debug", "error: " + ioe.getMessage(), ioe); 
     }  
     // ------------------ read the SERVER RESPONSE 
     try { 
      inStream = new DataInputStream(conn.getInputStream()); 
      String str; 
      while ((str = inStream.readLine()) != null) { 
       Log.e("Debug", "Server Response " + str); 
      } 
      inStream.close(); 

     } catch (IOException ioex) { 
      Log.e("Debug", "error: " + ioex.getMessage(), ioex); 
     } 

回答

3

经过长时间的搜索,我完成了在通知区域显示进度条的任务。我们需要的是asynctask。可能是这里显示的代码iam不能正常工作,它可以正常工作,当iam testing.Please检查并upvote for这个答案如果效果很好。

我的代码:

public class loadVideo extends AsyncTask<Void, Integer, Void> { 

     int progress = 0; 
     Notification notification; 
     NotificationManager notificationManager; 
     int id = 10; 

     protected void onPreExecute() { 

     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      HttpURLConnection conn = null; 
      DataOutputStream dos = null; 
      DataInputStream inStream = null; 
      String lineEnd = "\r\n"; 
      String twoHyphens = "--"; 
      String boundary = "*****"; 
      int bytesRead; 
      int sentData = 0;    
      byte[] buffer; 
      String urlString = "http://xxxxx/xxx/xxxxxx.php"; 
      try { 
       UUID uniqueKey = UUID.randomUUID(); 
       fname = uniqueKey.toString(); 
       Log.e("UNIQUE NAME", fname); 
       FileInputStream fileInputStream = new FileInputStream(new File(
         selectedPath)); 
       int length = fileInputStream.available(); 
       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=" + boundary); 
       dos = new DataOutputStream(conn.getOutputStream()); 
       dos.writeBytes(twoHyphens + boundary + lineEnd); 
       dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" 
         + fname + "" + lineEnd); 
       dos.writeBytes(lineEnd); 
       buffer = new byte[8192]; 
       bytesRead = 0; 
       while ((bytesRead = fileInputStream.read(buffer)) > 0) { 
        dos.write(buffer, 0, bytesRead); 
        sentData += bytesRead; 
        int progress = (int) ((sentData/(float) length) * 100); 
        publishProgress(progress); 
       } 
       dos.writeBytes(lineEnd); 
       dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
       Log.e("Debug", "File is written"); 
       fileInputStream.close(); 
       dos.flush(); 
       dos.close(); 

      } catch (MalformedURLException ex) { 
       Log.e("Debug", "error: " + ex.getMessage(), ex); 
      } catch (IOException ioe) { 
       Log.e("Debug", "error: " + ioe.getMessage(), ioe); 
      } 
      // ------------------ read the SERVER RESPONSE 
      try { 
       inStream = new DataInputStream(conn.getInputStream()); 
       String str; 
       while ((str = inStream.readLine()) != null) { 
        Log.e("Debug", "Server Response " + str); 
       } 
       inStream.close(); 

      } catch (IOException ioex) { 
       Log.e("Debug", "error: " + ioex.getMessage(), ioex); 
      } 

      return null; 
     } 

     @Override 
     protected void onProgressUpdate(Integer... progress) { 

      Intent intent = new Intent(); 
      final PendingIntent pendingIntent = PendingIntent.getActivity(
        getApplicationContext(), 0, intent, 0); 
      notification = new Notification(R.drawable.video_upload, 
        "Uploading file", System.currentTimeMillis()); 
      notification.flags = notification.flags 
        | Notification.FLAG_ONGOING_EVENT; 
      notification.contentView = new RemoteViews(getApplicationContext() 
        .getPackageName(), R.layout.upload_progress_bar); 
      notification.contentIntent = pendingIntent; 
      notification.contentView.setImageViewResource(R.id.status_icon, 
        R.drawable.video_upload); 
      notification.contentView.setTextViewText(R.id.status_text, 
        "Uploading..."); 
      notification.contentView.setProgressBar(R.id.progressBar1, 100, 
        progress[0], false); 
      getApplicationContext(); 
      notificationManager = (NotificationManager) getApplicationContext() 
        .getSystemService(Context.NOTIFICATION_SERVICE); 
      notificationManager.notify(id, notification); 
     } 

     protected void onPostExecute(Void result) { 
      Notification notification = new Notification(); 
      Intent intent1 = new Intent(MultiThreadActivity.this, 
        MultiThreadActivity.class); 
      final PendingIntent pendingIntent = PendingIntent.getActivity(
        getApplicationContext(), 0, intent1, 0); 
      int icon = R.drawable.check_16; // icon from resources 
      CharSequence tickerText = "Video Uploaded Successfully"; // ticker-text 
      CharSequence contentTitle = getResources().getString(
        R.string.app_name); // expanded message 
      // title 
      CharSequence contentText = "Video Uploaded Successfully"; // expanded 
                     // message 
      long when = System.currentTimeMillis(); // notification time 
      Context context = getApplicationContext(); // application 
                 // Context 
      notification = new Notification(icon, tickerText, when); 
      notification.flags |= Notification.FLAG_AUTO_CANCEL; 
      notification.setLatestEventInfo(context, contentTitle, contentText, 
        pendingIntent); 
      String notificationService = Context.NOTIFICATION_SERVICE; 
      notificationManager = (NotificationManager) context 
        .getSystemService(notificationService); 
      notificationManager.notify(id, notification); 
     } 
    } 

感谢和问候 孙大信。

+0

我只是想找一个解决方案,我正在考虑做的完全一样(没有尝试通知区域进度条)。唯一令我担心的是,当用户改变屏幕方向或离开应用程序时,线程将停止。但是......这不是问题,就像看到其他人正在使用我也在考虑的解决方案:) 如果别人有更好的解决方案,请让我们知道当然 – Honnes

+0

@Honnes你究竟是什么需要? – Manikandan

0

在RemoveView,您可以更新进度条。因此,结合一些例子代码,我得到的是这样的:

public class MyActivity extends Activity { 
private static final int PROGRESS = 0x1; 
private static final int MAX_PROGRESS = 100; 

private int mProgressStatus = 0; 

private Handler mHandler = new Handler(); 

protected void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    //define Notification 
    //... 

    RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout); 
    contentView.setProgressBar(R.id.progress_bar, MAX_PROGRESS, mProgressStatus, false); 
    notification.contentView = contentView; 

    // Start file upload in a background thread 
    new Thread(new Runnable() { 
     public void run() { 
      while (mProgressStatus < MAX_PROGRESS) { 
       mProgressStatus = doWork(); 

       // Update the progress bar 
       mHandler.post(new Runnable() { 
        public void run() { 
         contentView.setProgressBar(R.id.progress_bar, MAX_PROGRESS, mProgressStatus, false); 
        } 
       }); 
      } 
     } 
    }).start(); 
    } 
} 

blog post具有实现相同的一个很好的例子。希望这可以帮助。

+0

上面的代码引发空指针异常。你能检查代码并让我知道吗? – Manikandan

+0

你检查了博客文章吗?我认为它会解决你的问题。 – darsh

+0

是的,我看到了blog.But不知道如何同步上传代码与你提到的博客文章。 – Manikandan