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 b, но я не знаю, что делать дальше?

У меня есть следующий код для отправки запросов 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 много лет и не могу найти хороший способ сделать это.

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

Спасибо заранее,


Хорошо, я попробовал предложение Чираг Шаха. Вот мой код:

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

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

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 прямо в веб-браузере, журнал будет нормально.

Есть еще предложения?

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


person Eamorr    schedule 24.01.2011    source источник
comment
Я обнаружил, что сообщения http должны выполняться из задачи Async, иначе их просто не произойдет. Я искал сделать что-то подобное как для публикации, так и для получения данных, и мне нужно было перенести сообщения на URL-адрес в задаче async. (developer.android.com/reference/android/os/AsyncTask.html)   -  person Tim    schedule 15.11.2013


Ответы (1)


Если вы еще этого не сделали. Попробуйте обернуть сообщение на сервер в асинхронную задачу и вызвать задачу. Я обнаружил, что используемый мной 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);
person Tim    schedule 15.11.2013
comment
Фактический пост делается в uf.doPostToServer ... Я думаю, вы на правильном пути, просто попробуйте сделать его асинхронным и посмотрите, поможет ли это. Это сработало для меня. - person Tim; 15.11.2013