Thursday, May 9, 2013

[android help] upload image(blob) to specific container in azure


I did a camera application and i want to upload the picture taken by the camera into the blob storage in azure. Below is the code for me to select image from gallery and upload through the SAS URL. However when i tried entering the report class file, it force closes.



package com.example.testproject;

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;



public class Report extends ListActivity {
private StorageService mStorageService;
private final String TAG = "BlobsActivity";
private String mContainerName;
private ImageView mImgBlobImage;
private Uri mImageUri;
private AlertDialog mAlertDialog;

Button btnSelect, btnR;
ImageView iv;
TextView tv1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Get access to the storage service
StorageApplication myApp = (StorageApplication) getApplication();
mStorageService = myApp.getStorageService();
//Get data from the intent that launched this activity
Intent launchIntent = getIntent();
mContainerName = launchIntent.getStringExtra("ContainerName");

//Get the blobs for the selected container
mStorageService.getBlobsForContainer(mContainerName);


setContentView(R.layout.camera);
tv1=(TextView) findViewById(R.id.editText1);
btnR = (Button)findViewById(R.id.btnReport);
iv = (ImageView) findViewById(R.id.imageView1);
btnSelect = (Button)findViewById(R.id.btnSelect);
//Set select image handler
btnSelect.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
selectImage();
}
});

}

public void onClick(View v) {
mStorageService.getSasForNewBlob(mContainerName, tv1.getText().toString());

}

// Fire off intent to select image from gallery
protected void selectImage() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, 1111);
}

// Result handler for any intents started with startActivityForResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
//handle result from gallary select
if (requestCode == 1111) {
Uri currImageURI = data.getData();
mImageUri = currImageURI;
//Set the image view's image by using imageUri
mImgBlobImage.setImageURI(currImageURI);
}
} catch (Exception ex) {
Log.e(TAG, ex.getMessage());
}
}

/***
* Handles uploading an image to a specified url
*/
class ImageUploaderTask extends AsyncTask {
private String mUrl;
public ImageUploaderTask(String url) {
mUrl = url;
}

@Override
protected Boolean doInBackground(Void... params) {
try {
//Get the image data
Cursor cursor = getContentResolver().query(mImageUri, null,null, null, null);
cursor.moveToFirst();
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
String absoluteFilePath = cursor.getString(index);
FileInputStream fis = new FileInputStream(absoluteFilePath);
int bytesRead = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
while ((bytesRead = fis.read(b)) != -1) {
bos.write(b, 0, bytesRead);
}
byte[] bytes = bos.toByteArray();
// Post our image data (byte array) to the server
URL url = new URL(mUrl.replace("\"", ""));
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod("PUT");
urlConnection.addRequestProperty("Content-Type", "image/jpeg");
urlConnection.setRequestProperty("Content-Length", ""+ bytes.length);
// Write image data to server
DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream());
wr.write(bytes);
wr.flush();
wr.close();
int response = urlConnection.getResponseCode();
//If we successfully uploaded, return true
if (response == 201
&& urlConnection.getResponseMessage().equals("Created")) {
return true;
}
} catch (Exception ex) {
Log.e(TAG, ex.getMessage());
}
return false;
}

@Override
protected void onPostExecute(Boolean uploaded) {
if (uploaded) {
mAlertDialog.cancel();
mStorageService.getBlobsForContainer(mContainerName);
}
}
}
}


Here is my logcat error



05-09 02:39:16.576: E/AndroidRuntime(1440): FATAL EXCEPTION: main
05-09 02:39:16.576: E/AndroidRuntime(1440): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testproject/com.example.testproject.Report}: java.lang.ClassCastException: android.app.Application cannot be cast to com.example.testproject.StorageApplication
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.app.ActivityThread.access$600(ActivityThread.java:130)
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.os.Handler.dispatchMessage(Handler.java:99)
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.os.Looper.loop(Looper.java:137)
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.app.ActivityThread.main(ActivityThread.java:4745)
05-09 02:39:16.576: E/AndroidRuntime(1440): at java.lang.reflect.Method.invokeNative(Native Method)
05-09 02:39:16.576: E/AndroidRuntime(1440): at java.lang.reflect.Method.invoke(Method.java:511)
05-09 02:39:16.576: E/AndroidRuntime(1440): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-09 02:39:16.576: E/AndroidRuntime(1440): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-09 02:39:16.576: E/AndroidRuntime(1440): at dalvik.system.NativeStart.main(Native Method)
05-09 02:39:16.576: E/AndroidRuntime(1440): Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to com.example.testproject.StorageApplication
05-09 02:39:16.576: E/AndroidRuntime(1440): at com.example.testproject.Report.onCreate(Report.java:42)
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.app.Activity.performCreate(Activity.java:5008)
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
05-09 02:39:16.576: E/AndroidRuntime(1440): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
05-09 02:39:16.576: E/AndroidRuntime(1440): ... 11 more


Here is my StorageApplication Class



package com.example.testproject;

import android.app.Application;


public class StorageApplication extends Application {

private StorageService mStorageService;

public StorageApplication() {}

public StorageService getStorageService() {
if (mStorageService == null) {
mStorageService = new StorageService(this);
}
return mStorageService;
}

}


.

stackoverflow.comm

No comments:

Post a Comment

Google Voice on T-Mobile? [General]

Google Voice on T-Mobile? So I recently switched from a GNex on Verizon to a Moto X DE on T-Mobile. I had always used Google Voice for my v...