将图像(blob)上传到azure中的特定容器

时间:2013-05-09 02:42:06

标签: android azure azure-storage-blobs

我做了一个相机应用程序,我想将相机拍摄的照片上传到天蓝色的blob存储器中。以下是我从图库中选择图像并通过SAS URL上传的代码。但是,当我尝试输入报告类文件时,它会强制关闭。

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);
        }
    }
}
}

这是我的logcat错误

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

这是我的StorageApplication类

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 个答案:

答案 0 :(得分:0)

您可能忘记在StorageApplication中添加ApplicationAndroidManifest.xml类。声明为:

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

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