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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---