Android Open Source - mobcomp-httpclient Send Activity






From Project

Back to project page mobcomp-httpclient.

License

The source code is released under:

Written by: Markus Tacker <m@coderbyheart.de> | http://coderbyheart.de/ Copyright (c) Markus Tacker Permission is hereby granted, free of charge, to any person obtaining a copy of this software and ...

If you think the Android project mobcomp-httpclient listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package de.hsrm.mi.mobcomp.httpclientdemo;
//  w w  w.  java2  s  .co  m
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TreeMap;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;
import de.hsrm.mi.mobcomp.httpclientdemo.extra.ProgressMultipartEntity;
import de.hsrm.mi.mobcomp.httpclientdemo.extra.ProgressMultipartEntity.ProgressListener;
import de.hsrm.mi.mobcomp.httpclientdemo.flickr.RestAPI;
import de.hsrm.mi.mobcomp.httpclientdemo.flickr.UploadReader;

/**
 * Demonstriert, wie man mit dem {@link HttpClient} Daten hochladen kann.
 * 
 * In diesem Beispiel machen wir mit der Kamera ein Bild und schicken dieses zu
 * flickr.
 * 
 * @see http://www.flickr.com/services/api/
 * 
 *      Whrend dem Upload zeigen wir auch noch den Verlauf an.
 * 
 * @author Markus Tacker <m@coderbyheart.de>
 */
public class SendActivity extends MenuActivity {

  private String flickrAPIKey;
  private RestAPI flickrAPI;
  private String flickrAPISecret;
  private Handler handler = new Handler();
  private String flickrAPIAuthToken;

  private static final int CAPTURE_PICTURE = 1;
  private ImageButton cameraButton;
  private ImageView previewUpload;
  private Bitmap bitmap;
  private Uri selectedImageUri;
  private File imageFile;
  private long totalSize;
  private ProgressDialog pd;
  private Button uploadButton;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // OAuth wird erstmal nicht verwendet, da das nicht zum Thema gehrt
    // daher verwenden wir den API-Key, das API-Secret und den Auth-Token
    SharedPreferences prefs = PrefsActivity.getPreferences(this);
    String keyFlickrAPIKey = getResources().getString(R.string.key_api_key);
    String keyFlickrAPISecret = getResources().getString(
        R.string.key_api_secret);
    String keyFlickrAPIAuthToken = getResources().getString(
        R.string.key_api_auth_token);
    flickrAPIKey = prefs.getString(keyFlickrAPIKey, null);
    flickrAPISecret = prefs.getString(keyFlickrAPISecret, null);
    flickrAPIAuthToken = prefs.getString(keyFlickrAPIAuthToken, null);

    // Keine Einstellung vorhanden? Dann Konfigurieren.
    if (flickrAPIAuthToken == null || flickrAPIAuthToken.length() <= 0) {
      startActivity(new Intent(getApplicationContext(),
          FlickrAuthActivity.class));
      finish();
      return;
    }

    setContentView(R.layout.send);

    // Vorschau des Bildes, das hochgeladen werden soll
    previewUpload = (ImageView) findViewById(R.id.previewUpload);

    // Der Button zum Starten der Kamera-App
    cameraButton = (ImageButton) findViewById(R.id.cameraButton);
    cameraButton.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {

        // Fr den Upload brauchen wir eine Datei,
        // daher dem Intent mit geben
        File cacheDir = new File(Environment
            .getExternalStorageDirectory().getAbsolutePath()
            + "/de.hsrm.mi.mobcomp.httpclientdemo/captures/");
        if (!cacheDir.exists()) {
          if (!cacheDir.mkdirs()) {
            Log.e(getClass().getCanonicalName(),
                "Failed to create directory: "
                    + cacheDir.toString());
            return;
          }
        }
        // Pfad zur Bild-Datei
        imageFile = new File(cacheDir.getAbsolutePath()
            + "/"
            + new SimpleDateFormat("yyyyMMdd_HHmmss")
                .format(new Date()) + ".jpg");

        selectedImageUri = Uri.fromFile(imageFile);

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, selectedImageUri);

        startActivityForResult(
            Intent.createChooser(intent, "Select Picture"),
            CAPTURE_PICTURE);
      }
    });

    // Startet den Upload
    uploadButton = (Button) findViewById(R.id.uploadButton);
    uploadButton.setEnabled(false);
    uploadButton.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // Der Upload wird in einem eigenen Thread gestartet
        new Thread(new Runnable() {
          @Override
          public void run() {
            // ProgressDialog anzeigen
            handler.post(new Runnable() {
              @Override
              public void run() {
                pd.show();
              }
            });
            // Upload starten
            uploadBitmap(bitmap);
            // ProgressDialog verbergen
            handler.post(new Runnable() {
              @Override
              public void run() {
                pd.dismiss();
                Toast.makeText(SendActivity.this,
                    "Upload complete", Toast.LENGTH_LONG)
                    .show();
              }
            });
          }

        }).start();
      }
    });

    // Liefert die ntigen URLs fr den Upload
    flickrAPI = new RestAPI(flickrAPIKey, flickrAPISecret,
        flickrAPIAuthToken);

    // Zeigt whrend des Uploads den Verlauf an
    // Knnte man auch als Notification implementieren
    pd = new ProgressDialog(this);
    pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    pd.setMessage(getResources().getString(R.string.uploading));
    pd.setCancelable(false);
  }

  /**
   * Ldt das Bild hoch
   * 
   * Verwendet dazu MultipartEntity aus Apache HttpComponents
   * 
   * @see http://hc.apache.org/
   * 
   * @param bitmap
   * @return
   */
  private void uploadBitmap(Bitmap bitmap) {

    // Dieser erste Teil ist NUR fr die flickr-API ntig
    TreeMap<String, String> params = new TreeMap<String, String>();
    params.put("api_key", flickrAPI.getApiKey());
    params.put("auth_token", flickrAPI.getAuthToken());
    params.put("tags", "httpclientdemo hsrm mobile android");
    String requestSignature = flickrAPI.sign(params);

    // Der eigentliche Upload begint ab hier:
    HttpClient client = new DefaultHttpClient();
    HttpPost request = new HttpPost(flickrAPI.getUploadUri().toString());

    // MultipartEntity multipartContent = new MultipartEntity();
    // Verwenden hier eine Version mit berwachung des Fortschritts
    ProgressMultipartEntity multipartContent = new ProgressMultipartEntity(
        new ProgressListener() {
          @Override
          public void transferred(long num) {
            publishProgress((int) ((num / (float) totalSize) * 100));
          }
        });

    try {
      // Mgliche Datentypen fr die Felder:
      // ByteArrayBody, FileBody, InputStreamBody, StringBody
      for (String param : params.keySet()) {
        multipartContent.addPart(param,
            new StringBody(params.get(param)));
      }
      // Das Photo wird als Datei angehngt
      multipartContent.addPart("photo", new FileBody(imageFile));
      // Zum Schluss noch die Signatur fr flickr
      multipartContent.addPart("api_sig",
          new StringBody(requestSignature));
      // Fr die Fortschrittsanzeige merken wir uns die Gesamtgre der
      // Anfrage
      totalSize = multipartContent.getContentLength();
    } catch (UnsupportedEncodingException e) {
      Log.e(getClass().getCanonicalName(), e.toString());
    }

    // Dem Request bergeben ...
    request.setEntity(multipartContent);

    try {
      // ... und abschicken
      HttpResponse response = client.execute(request);

      // / Jetzt wie bei bei einem GET-Request die Antwort verarbeiten
      StatusLine status = response.getStatusLine();
      if (status.getStatusCode() != 200) {
        throw new IOException("Invalid response from server: "
            + status.toString());
      }

      HttpEntity entity = response.getEntity();
      InputStream inputStream = entity.getContent();
      ByteArrayOutputStream content = new ByteArrayOutputStream();
      int readBytes = 0;
      byte[] sBuffer = new byte[512];
      while ((readBytes = inputStream.read(sBuffer)) != -1) {
        content.write(sBuffer, 0, readBytes);
      }
      String dataAsString = new String(content.toByteArray());

      // Liest die neue Photo-ID aus der Antwort aus
      UploadReader ur = new UploadReader();
      String photoId = ur.getPhotoId(dataAsString);
      Log.v(getClass().getCanonicalName(), photoId);
    } catch (IOException e) {
      Log.e(getClass().getCanonicalName(), e.toString());
    }
  }

  /**
   * Progressbar aktualisieren
   * 
   * @param i
   *            Progress in Prozent 0 > i > 100
   */
  protected void publishProgress(final int i) {
    Log.v(getClass().getCanonicalName(), "Progress: " + i);
    handler.post(new Runnable() {
      @Override
      public void run() {
        pd.setProgress(i);
      }
    });
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
      if (requestCode == CAPTURE_PICTURE) {
        ContentResolver cr = getContentResolver();
        Bitmap bitmap;
        try {
          // Den Speicherort des Fotos haben wir beim Starten des
          // Intents vorgegeben, jetzt holen wir uns von dort das Bild
          bitmap = android.provider.MediaStore.Images.Media
              .getBitmap(cr, selectedImageUri);
          previewUpload.setImageBitmap(bitmap);
          // Den Upload-Button aktivieren
          uploadButton.setEnabled(true);
        } catch (Exception e) {
          Log.e(getClass().getCanonicalName(), e.toString());
        }
      }
    }
  }
}




Java Source Code List

de.hsrm.mi.mobcomp.httpclientdemo.FlickrAuthActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.LoadActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.MainActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.MenuActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.PrefsActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.SendActivity.java
de.hsrm.mi.mobcomp.httpclientdemo.extra.IdFile.java
de.hsrm.mi.mobcomp.httpclientdemo.extra.ParameterRunnable.java
de.hsrm.mi.mobcomp.httpclientdemo.extra.ProgressMultipartEntity.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.AuthReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.FrobReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.ImageLoader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.RestAPI.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.SetsReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.SizesReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.UploadReader.java
de.hsrm.mi.mobcomp.httpclientdemo.flickr.XmlReader.java