Capture photo with android and upload it to SoftLayer Open Storage
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.devniel.braph.fragments.PhotoFragment"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_take_photo"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="@string/take_photo"/>
<Button
android:id="@+id/btn_upload_photo"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="@string/upload_photo"/>
<ImageView
android:layout_height="400dp"
android:layout_width="fill_parent"
android:visibility="visible"
android:id="@+id/photo"
android:layout_marginTop="30dp"/>
</LinearLayout>
</FrameLayout>
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.0.2"
defaultConfig {
applicationId "com.devniel.braph"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "org.apache.httpcomponents:httpclient:4.3.6"
}
package com.devniel.braph.fragments;
import android.app.Activity;
import android.app.Fragment;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import com.devniel.braph.R;
import com.devniel.braph.listeners.HttpResponseListener;
import com.devniel.braph.utils.HttpFileUploader;
import org.apache.http.message.BasicNameValuePair;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class PhotoFragment extends Fragment implements View.OnClickListener {
private static final String TAG = "PhotoFragment";
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
private ImageView photo;
public static PhotoFragment newInstance(String param1, String param2) {
PhotoFragment fragment = new PhotoFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public PhotoFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_photo, container, false);
Button btn_take_photo = (Button) view.findViewById(R.id.btn_take_photo);
btn_take_photo.setOnClickListener(this);
Button btn_upload_photo = (Button) view.findViewById(R.id.btn_upload_photo);
btn_upload_photo.setOnClickListener(this);
photo = (ImageView) view.findViewById(R.id.photo);
return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_take_photo:
takePhoto();
break;
case R.id.btn_upload_photo:
uploadPhoto();
break;
default:
break;
}
}
/**
* Interface
*/
public interface OnFragmentInteractionListener {
public void onPhoto(Uri uri);
}
/**
* Button On Click Listener
*/
static final int REQUEST_IMAGE_CAPTURE = 1;
static final int REQUEST_TAKE_PHOTO = 1;
public void takePhoto(){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(this.getActivity().getPackageManager()) != null) {
// Create the File where the photo should go
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
// Error occurred while creating the File
Log.e(TAG, ex.getMessage());
}
// Continue only if the File was successfully created
if (photoFile != null) {
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
getPhoto();
}
super.onActivityResult(requestCode, resultCode, data);
}
String mCurrentPhotoPath;
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = image.getAbsolutePath();
return image;
}
private void getPhoto() {
Log.d(TAG, "PHOTO : " + photo.toString());
// Get the dimensions of the View
int targetW = photo.getWidth();
int targetH = photo.getHeight();
// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
Log.d(TAG, "Current photo path : " + mCurrentPhotoPath);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;
// Determine how much to scale down the image
int scaleFactor = 1;
if(targetW > 0 && targetH > 0)
scaleFactor = Math.min(photoW/targetW, photoH/targetH);
// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;
bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
photo.setImageBitmap(bitmap);
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + "devniel.jpg");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
try {
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.close();
mCurrentPhotoPath = f.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
}
private void uploadPhoto() {
HttpFileUploader request = new HttpFileUploader();
request.setUrl("https://dal05.objectstorage.softlayer.net/v1/AUTH_2809ef13-5269-47b8-a204-8e6adeaf53f6/PDTP/photos/devniel.jpg");
request.addHeader(new BasicNameValuePair("X-Auth-Token", "AUTH_tkbf368f3b5b56433b913a7d6dcda32dee"));
request.setFilePath(mCurrentPhotoPath);
request.setFileType("image/jpeg");
request.setResponseListener(new HttpResponseListener() {
@Override
public void onResponse(String result, Integer status) {
Log.d(TAG, "RESPONSE : " + status);
}
@Override
public void onError(Exception error) {
}
});
request.execute();
}
}
package com.devniel.braph.listeners;
public interface HttpResponseListener {
public void onResponse(String result, Integer status);
public void onError(Exception error);
}
package com.devniel.braph.utils;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import com.devniel.braph.listeners.HttpResponseListener;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.IOException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
public class HttpFileUploader extends AsyncTask<Object, Void, Object>{
static final String TAG = HttpJSON.class.getSimpleName();
public String result;
public HttpResponseListener responseListener;
public LinearLayout progressBar;
public String url;
public String method;
private ArrayList <NameValuePair> headers;
private ArrayList<NameValuePair> postParams;
private int timeout = 30000;
private String filePath;
private String fileType;
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
private String authToken;
public String getAuthToken() {
return authToken;
}
public void setAuthToken(String authToken) {
this.authToken = authToken;
}
public HttpFileUploader(String url) {
this.url = url;
this.headers = new ArrayList<NameValuePair>();
this.postParams = new ArrayList<NameValuePair>();
}
public HttpFileUploader() {
this.headers = new ArrayList<NameValuePair>();
this.postParams = new ArrayList<NameValuePair>();
}
public void addHeader(NameValuePair header)
{
headers.add(header);
}
public void addPostParam(NameValuePair param) {
postParams.add(param);
}
public JSONObject getData() {
JSONObject jsonObj = new JSONObject();
for(NameValuePair p : postParams) {
try {
jsonObj.put(p.getName(), p.getValue());
} catch (JSONException e) {
Log.e(TAG, "JSONException: " + e);
}
}
return jsonObj;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if(progressBar != null){
progressBar.setVisibility(View.VISIBLE);
progressBar.bringToFront();
}
}
@Override
protected void onPostExecute(Object res){
if(progressBar != null)
progressBar.setVisibility(View.GONE);
if(res instanceof JSONObject){
JSONObject response = (JSONObject) res;
Integer status = 400;
String data = null;
try {
status = response.getInt("status");
} catch (JSONException e) {
e.printStackTrace();
status = 400;
} catch (NullPointerException e) {
e.printStackTrace();
status = 400;
}
if(responseListener != null)
responseListener.onResponse(data,status);
}else{
Exception response = (Exception) res;
responseListener.onError(response);
}
}
public Object request() {
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPut put = new HttpPut(this.getUrl()); //-X PUT
for(NameValuePair header : headers)
put.addHeader(header.getName(), header.getValue());
put.setEntity(new FileEntity(new File(getFilePath()), "image/jpeg")); //@ - absolute path
HttpResponse res = httpClient.execute(put);
JSONObject response = new JSONObject();
response.put("status", res.getStatusLine().getStatusCode());
return response;
} catch (ConnectException e){
e.printStackTrace();
return e;
} catch (ClientProtocolException e) {
e.printStackTrace();
return e;
} catch (SocketTimeoutException e){
e.printStackTrace();
return e;
} catch (IOException e){
e.printStackTrace();
return e;
} catch (JSONException e) {
e.printStackTrace();
return e;
}
};
public LinearLayout getProgressBar() {
return progressBar;
}
public void setProgressBar(LinearLayout progressBar) {
this.progressBar = progressBar;
}
protected Object doInBackground(Object... params) {
return request();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMethod() {
return method;
}
public HttpResponseListener getResponseListener() {
return responseListener;
}
public void setResponseListener(HttpResponseListener responseListener) {
this.responseListener = responseListener;
}
}
package com.devniel.braph.activities;
import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import com.devniel.braph.R;
import com.devniel.braph.fragments.PhotoFragment;
public class AppActivity extends Activity
implements PhotoFragment.OnFragmentInteractionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction().add(R.id.container, new PhotoFragment()).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_app, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onPhoto(Uri uri) {
// Work with photo result here , after upload.
}
}