2011-01-24 3 views
6

Привет,Android: загрузить фото

У меня возникли проблемы с загрузкой фотографии с моего телефона на Android. Вот код, я использую, чтобы предложить пользователю выбрать фотографию:

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? 




      } 
     } 

    } 

Так я имею Bitmap б, однако я не знаю, что делать дальше?

У меня есть следующий код для отправки запросов 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); 

Как я могу подключить растровое изображение к этому? Я искал google целую вечность и не могу найти хороший способ сделать это.

Я надеюсь, что кто-то может помочь.

Большое спасибо заранее,


Ok Я попытался предложение Чираг шаха. Вот мой код:

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

где функция пост (как рекомендуется):

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

Однако myurl.com/ajax/uploadPhoto.php получает ничего. Я создал журнал PHP для регистрации любой активности на uploadPhoto.php, и ничего не появляется. Стоит отметить, что если я просто напечатаю myurl.com/ajax/uploadPhoto.php прямо в веб-браузере, он регистрируется в порядке.

Другие предложения?

Большое спасибо,

+0

Я нашел что http-сообщения должны выполняться из задачи Async, иначе они просто не произойдут. Я смотрел на то, чтобы делать что-то похожее как на публикацию, так и на получение данных, а также для того, чтобы обернуть сообщения в URL-адрес в async-задаче. (http://developer.android.com/reference/android/os/AsyncTask.html) – Tim

ответ

0

Если вы еще этого не сделали. Попробуйте обернуть сообщение на сервер в Async Task и вызвать задачу. Я обнаружил, что api, который я использую, требует, чтобы http-сообщения/были удалены от основного потока, чтобы избежать возможных проблем, блокирующих основной поток.

Было относительно просто установить его как задачу Async, и это начало работать.

Более подробная информация о асинхронных задачах: http://developer.android.com/reference/android/os/AsyncTask.html

Для простого примера это одна из моих асинхронных задач:

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

    } 
} 

и называется OnClick с

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

Фактическое сообщение сделано в uf.doPostToServer ... Я думаю, что вы на правильном пути, просто попробуйте сделать его асинхронным и посмотрите, помогает ли это. Это было для меня. – Tim

Смежные вопросы