2011-01-24 47 views
6

Chúc mừng,Android: tải lên ảnh

Tôi gặp sự cố khi tải ảnh lên từ điện thoại Android của mình. Đây là mã tôi đang sử dụng để nhắc người dùng chọn ảnh:

public class Uploader{ 
     public void upload(){ 
      Log.i("EOH","hi..."); 
      Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT); 
      photoPickerIntent.setType("image/*"); 
      startActivityForResult(photoPickerIntent, 1); 
     } 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) 
     { 
      if (resultCode == RESULT_OK) 
      { 
       Bundle extras = data.getExtras(); 
       Bitmap b = (Bitmap) extras.get("data"); 
       //what do do now with this Bitmap... 
        //how do I upload it? 




      } 
     } 

    } 

Vì vậy, tôi có Bitmap b, tuy nhiên tôi không biết phải làm gì tiếp theo?

Tôi có đoạn code sau đây để gửi yêu cầu POST:

List<NameValuePair> params = new ArrayList<NameValuePair>(2); 
params.add(new BasicNameValuePair("someValA", String.valueOf(lat))); 
params.add(new BasicNameValuePair("someValB", String.valueOf(lng))); 
new HttpConnection(handler).post("http://myurl.com/upload.php",params); 

Làm thế nào tôi có thể treo lên một hình ảnh Bitmap này? Tôi đã tìm kiếm google cho lứa tuổi và không thể tìm thấy một cách tốt để làm điều đó.

Tôi hy vọng ai đó có thể trợ giúp.

Nhiều cảm ơn trước,


Ok Tôi đã thử gợi ý Chirag shah của. Đây là mã của tôi:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
     { 
      if (resultCode == RESULT_OK) 
      { 
       Uri imageUri=data.getData(); 
       List<NameValuePair> params = new ArrayList<NameValuePair>(1); 
       params.add(new BasicNameValuePair("image", imageUri.getPath())); 
       post("http://www.myurl.com/ajax/uploadPhoto.php",params); 
      } 
     } 

nơi bài function (theo khuyến cáo) là:

public void post(String url, List<NameValuePair> nameValuePairs) { 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpContext localContext = new BasicHttpContext(); 
      HttpPost httpPost = new HttpPost(url); 

      try { 
       MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

       for(int index=0; index < nameValuePairs.size(); index++) { 
        if(nameValuePairs.get(index).getName().equalsIgnoreCase("image")) { 
         // If the key equals to "image", we use FileBody to transfer the data 
         entity.addPart(nameValuePairs.get(index).getName(), new FileBody(new File (nameValuePairs.get(index).getValue()))); 
        }else{ 
         // Normal string data 
         entity.addPart(nameValuePairs.get(index).getName(), new StringBody(nameValuePairs.get(index).getValue())); 
        } 
       } 

       httpPost.setEntity(entity); 

       HttpResponse response = httpClient.execute(httpPost, localContext); 
       Log.i("EOH",response.toString()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
    } 

Tuy nhiên myurl.com/ajax/uploadPhoto.php là nhận được gì cả. Tôi đã tạo một bản ghi PHP để đăng nhập bất kỳ hoạt động nào trên uploadPhoto.php và không có gì hiển thị. Cần lưu ý rằng nếu tôi chỉ nhập myurl.com/ajax/uploadPhoto.php vào trình duyệt web, nó sẽ ghi nhật ký tốt.

Mọi đề xuất khác?

Rất cám ơn,

+0

tôi đã tìm thấy rằng các bài viết http phải được thực hiện từ một tác vụ Async nếu không chúng sẽ không xảy ra. Tôi đã xem xét việc làm một cái gì đó tương tự như đăng và nhận dữ liệu và cần thiết để bọc các bài viết vào url trong một nhiệm vụ không đồng bộ. (http://developer.android.com/reference/android/os/AsyncTask.html) – Tim

Trả lời

0

Nếu bạn chưa làm như vậy. Thử gói bài đăng lên máy chủ trong Công việc không đồng bộ và gọi nhiệm vụ. Tôi thấy rằng api tôi đang sử dụng yêu cầu http bài viết/được thực hiện từ các chủ đề chính để tránh các vấn đề có thể khóa lên các chủ đề chính.

Nó tương đối dễ dàng chỉ để thiết lập nó như là một nhiệm vụ Async và bắt đầu thực sự làm việc.

Thông tin thêm về nhiệm vụ Async: http://developer.android.com/reference/android/os/AsyncTask.html

Đối với một ví dụ đơn giản này là một trong những nhiệm vụ async của tôi:

private class SomeAsyncTask extends AsyncTask<String, Void, JSONObject> { 

    @Override 
    protected JSONObject doInBackground(String... arg0) { 

     UserFunctions uf = new UserFunctions(); 
     JSONObject res = uf.doPostToServer(arg0[0], arg0[1], arg0[2], getApplicationContext()); 

     return res; 
    } 

    @Override 
    protected void onPostExecute(JSONObject result) { 

     try { 
      int success = result.getInt("success"); 
      if(success == 1) { 

       Intent vcact = new Intent(getApplicationContext(), OtherActivity.class); 
       vcact.putExtra("id", cid); 
       startActivity(vcact); 
       // close main screen 
       finish(); 

      } else { 
       Toast.makeText(SomeActivity.this, "Error saving to server. Try again.", Toast.LENGTH_SHORT).show(); 
      } 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

và nó được gọi onclick với

new SomeAsyncTask().execute(cid, otherdata, moredata); 
+0

Bài đăng thực tế được thực hiện trong uf.doPostToServer ... Tôi nghĩ bạn đang đi đúng hướng, chỉ cần thử làm cho nó không đồng bộ và xem nếu nó giúp. Nó đã làm cho tôi. – Tim