I'm starting a new thread, in response to a request over here:
http://bit.ly/E1Qqm

This is some sample code for uploading an image to the web, as part of
a multipart message. It assumes that the photo is stored on the SD
card as "photo.jpg". You'll need to download and add a couple of jar
files to the project's built path - commons-httpclient.jar and
httpcomponents-client-4.0-alpha4.

It is working on my device. However (big caveats here) - it's much
slower than I would like, and much slower than other applications I've
installed that upload photos. It also feels hacky - e.g. the way the
background thread communicates problems with the upload to the main
thread using variables. I'm sure there must be a neater way to do it.

If you figure out a way to improve the code, please post suggestions
here!

cheers,
Anna

-------------------------------------

        private static final int LOCATION_NOT_FOUND = 1;
        private static final int UPLOAD_ERROR = 2;
        final Runnable mUpdateResults = new Runnable() {
                public void run() {
                        pd.dismiss();
                        updateResultsInUi();
                }
        };

        public void onCreate(Bundle icicle) {
                super.onCreate(icicle);
                setContentView(R.layout.home);

                // do some stuff and then, when you want to upload a
photo....
                uploadToWeb();
                }

        //
**********************************************************************
        // uploadToWeb: uploads details, handled via a background thread
        //
**********************************************************************
        private void uploadToWeb() {
                Log.d(LOG_TAG, "uploadToWeb");
                pd = ProgressDialog
                                .show(
                                                this,
                                                "Uploading, please wait...",
                                                "Uploading. This can take 
several seconds, depending on your
connection speed. Please be patient!",
                                                true, false);
                Thread t = new Thread() {
                        public void run() {
                                doUploadinBackground();
                                mHandler.post(mUpdateResults);
                        }
                };
                t.start();
        }

        private void updateResultsInUi() {
                if (globalStatus == UPLOAD_ERROR) {
                        showDialog(UPLOAD_ERROR);

                } else if (globalStatus == LOCATION_NOT_FOUND) {
                        showDialog(LOCATION_NOT_FOUND);

                } else if (globalStatus == PHOTO_NOT_FOUND) {
                        showDialog(PHOTO_NOT_FOUND);

                } else {
                        // Success! - Proceed to the success activity!
                        Intent i = new Intent(Home.this, Success.class);
                        startActivity(i);
                }
        }

        //
**********************************************************************
        // onCreateDialog: Dialog warnings
        //
**********************************************************************
        @Override
        protected Dialog onCreateDialog(int id) {
                switch (id) {
                case UPLOAD_ERROR:
                        return new AlertDialog.Builder(Home.this)
                                        .setTitle("Upload error")
                                        .setPositiveButton("OK",
                                                        new 
DialogInterface.OnClickListener() {
                                                                public void 
onClick(DialogInterface dialog,
                                                                                
int whichButton) {
                                                                }
                                                        })
                                        .setMessage(
                                                        "Sorry, there was an 
error uploading. Please try again later.")
                                        .create();
                case LOCATION_NOT_FOUND:
                        return new AlertDialog.Builder(Home.this)
                                        .setTitle("Location problem")
                                        .setPositiveButton("OK",
                                                        new 
DialogInterface.OnClickListener() {
                                                                public void 
onClick(DialogInterface dialog,
                                                                                
int whichButton) {
                                                                }
                                                        })
                                        .setMessage(
                                                        "Could not get 
location! Can you see the sky? Please try again
later.")
                                        .create();
                }
                return null;
        }

        //
**********************************************************************
        // doUploadinBackground: POST request
        //
**********************************************************************
        private boolean doUploadinBackground() {
                Log.d(LOG_TAG, "doUploadinBackground");
                String responseString = null;
                PostMethod method;

                if ((latitude != null) && (longitude != null)) {
                        latString = latitude.toString();
                        longString = longitude.toString();
                        Log.e(LOG_TAG, "Latitude = " + latString);
                        Log.e(LOG_TAG, "Longitude = " + longString);
                } else {
                        Log.e(LOG_TAG, "Location is null");
                        globalStatus = LOCATION_NOT_FOUND;
                        return false;
                }

                method = new PostMethod("yoururlhere");

                try {

                        byte[] imageByteArray = null;

                        HttpClient client = new HttpClient();
                        
client.getHttpConnectionManager().getParams().setConnectionTimeout(
                                        100000);

                        File f = new 
File(Environment.getExternalStorageDirectory(),
                                        "photo.jpg");

                        imageByteArray = getBytesFromFile(f);

                        Log
                                        .d(LOG_TAG, "len of data is " + 
imageByteArray.length
                                                        + " bytes");

                        FilePart photo = new FilePart("photo", new 
ByteArrayPartSource(
                                        "photo", imageByteArray));

                        photo.setContentType("image/jpeg");
                        photo.setCharSet(null);

                        Part[] parts = { new StringPart("service", "Android 
mobile"),
                                        new StringPart("subject", subject),
                                        new StringPart("name", name),
                                        new StringPart("email", email),
                                        new StringPart("lat", latString),
                                        new StringPart("lon", longString), 
photo };

                        method.setRequestEntity(new 
MultipartRequestEntity(parts, method
                                        .getParams()));

                        client.executeMethod(method);
                        responseString = method.getResponseBodyAsString();
                        method.releaseConnection();

                        Log.e("httpPost", "Response status: " + responseString);
                        Log.e("httpPost", "Latitude = " + latString + " and 
Longitude = "
                                        + longString);

                } catch (Exception ex) {
                        Log.v(LOG_TAG, "Exception", ex);
                        return false;
                } finally {
                        method.releaseConnection();
                }

                if (responseString.equals("SUCCESS")) {
                        // launch the Success page
                        return true;
                } else {
                        globalStatus = UPLOAD_ERROR;
                        return false;
                }
        }

        // read the photo file into a byte array...
        public static byte[] getBytesFromFile(File file) throws IOException {
                InputStream is = new FileInputStream(file);
                // Get the size of the file
                long length = file.length();
                // You cannot create an array using a long type.
                // It needs to be an int type.
                // Before converting to an int type, check
                // to ensure that file is not larger than Integer.MAX_VALUE.
                if (length > Integer.MAX_VALUE) {
                        // File is too large
                }

                // Create the byte array to hold the data
                byte[] bytes = new byte[(int) length];
                // Read in the bytes
                int offset = 0;
                int numRead = 0;
                while (offset < bytes.length
                                && (numRead = is.read(bytes, offset, 
bytes.length - offset)) >= 0)
{
                        offset += numRead;
                }

                // Ensure all the bytes have been read in
                if (offset < bytes.length) {
                        throw new IOException("Could not completely read file "
                                        + file.getName());
                }

                // Close the input stream and return bytes
                is.close();
                return bytes;
        }

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to