0
votes

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<Void, Void, Boolean> {
    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;
}

}
1
where is StorageApplication class? make sure u are extending Application class to itρяσѕρєя K
i have just added my storage application class above.Bryan

1 Answers

0
votes

Probably you forget to add StorageApplication class which extending Application class in AndroidManifest.xml. declare it as:

<application
......
android:name="com.example.testproject.StorageApplication">

..........
</application>