2011-01-24 6 views
6

Pozdrowienia,Android: Prześlij zdjęcia

Mam problemy z przesłaniem zdjęcia z telefonu z Androidem. Oto kod używam monitować użytkownika, aby wybrać zdjęcie:

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? 




      } 
     } 

    } 

więc mam bitmapy b, jednak nie wiem, co robić dalej?

Mam następujący kod do wysyłania żądania 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); 

Jak mogę podłączyć bitmapę do tego? Szukałem google od wieków i nie mogę znaleźć dobrego sposobu na zrobienie tego.

Mam nadzieję, że ktoś może pomóc.

Dziękujemy wcześniej,


Ok Próbowałem sugestię chirag szaha. Tu jest mój kodu:

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); 
      } 
     } 

gdzie funkcja post (zgodnie z zaleceniami) wynosi:

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(); 
      } 
    } 

Jednak myurl.com/ajax/uploadPhoto.php robi nic. Stworzyłem dziennik PHP, który rejestruje dowolne działanie na uploadPhoto.php i nic się nie wyświetla. Warto zauważyć, że jeśli po prostu wpisuję myurl.com/ajax/uploadPhoto.php bezpośrednio w przeglądarce, loguje się dobrze.

Wszelkie dodatkowe sugestie?

Wielkie dzięki,

+0

Znalazłem że posty http muszą być wykonywane z poziomu zadania Async, w przeciwnym razie po prostu się nie stanie. Szukałem czegoś podobnego zarówno do wysyłania, jak i pobierania danych i do pakowania postów w adres URL w zadaniu asynchronicznym. (http://developer.android.com/reference/android/os/AsyncTask.html) – Tim

Odpowiedz

0

Jeśli jeszcze nie jesteś. Spróbuj zawinąć wpis na serwerze w Zadaniu asynchronicznym i wywołując zadanie. Zauważyłem, że api, którego używam, wymaga, aby http zaczynał/był robiony z dala od głównego wątku, aby uniknąć ewentualnych problemów z zamykaniem głównego wątku.

Było stosunkowo łatwo po prostu ustawić jako zadanie asynchroniczne i zaczęło działać.

Więcej informacji na ASYNC zadań: http://developer.android.com/reference/android/os/AsyncTask.html

Na prostym przykładzie jest to jeden z moich zadań asynchronicznych:

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(); 
     } 

    } 
} 

i nazywa onclick z

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

Właściwy wpis jest wykonywany w uf.doPostToServer ... Myślę, że jesteś na dobrej drodze, spróbuj zrobić to asynchronicznie i zobacz, czy to pomaga. To zrobiło dla mnie. – Tim