2011-01-24 14 views
6

Saludos,Android: subir fotos

Tengo problemas para subir una foto desde mi teléfono Android. Aquí está el código que estoy usando para solicitar al usuario que seleccione una foto:

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? 




      } 
     } 

    } 

Así que tienen el mapa de bits b, sin embargo no sé qué hacer a continuación?

tengo el siguiente código para el envío de solicitudes 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); 

¿Cómo puede una imagen bitmap Puedo conectar a esto? He buscado en Google durante años y no puedo encontrar una buena manera de hacerlo.

Espero que alguien pueda ayudar.

Muchas gracias de antemano,


Ok He intentado sugerencia chirag de Shah. Aquí está mi código:

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

donde la función de puesto de trabajo (recomendado) es:

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

Sin embargo myurl.com/ajax/uploadPhoto.php está recibiendo nada. Creé un registro PHP para registrar cualquier actividad en uploadPhoto.php, y no aparece nada. Vale la pena señalar que si simplemente escribo myurl.com/ajax/uploadPhoto.php directamente en un navegador web, se registra correctamente.

¿Alguna sugerencia más?

Muchas gracias,

+0

que he encontrado que las publicaciones http deben realizarse desde una tarea Async; de lo contrario, simplemente no sucederán. He estado buscando hacer algo similar publicando y obteniendo datos y necesitaba envolver las publicaciones en la url en una tarea asíncrona. (http://developer.android.com/reference/android/os/AsyncTask.html) – Tim

Respuesta

0

Si aún no lo ha hecho. Intente envolver la publicación en el servidor en una tarea asíncrona y llame a la tarea. Descubrí que la API que estoy usando requiere que las publicaciones http/se eliminen del hilo principal para evitar posibles problemas que bloqueen el hilo principal.

Fue relativamente fácil simplemente configurarlo como una tarea Async y eso comenzó a funcionar realmente.

Más información sobre las tareas asíncronas: http://developer.android.com/reference/android/os/AsyncTask.html

Para un ejemplo sencillo este es uno de mis tareas asíncronas:

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

    } 
} 

y se llama onclick con

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

La publicación real se realiza en uf.doPostToServer ... Creo que está en el camino correcto, solo intente hacerlo asincrónico y ver si ayuda. Lo hizo por mi – Tim

Cuestiones relacionadas