简体   繁体   English

将图像(blob)上传到天蓝色的特定容器

[英]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. 我做了一个相机应用程序,我想将相机拍摄的照片上传到天蓝色的Blob存储中。 Below is the code for me to select image from gallery and upload through the SAS URL. 以下是我从图库中选择图像并通过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 这是我的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

Here is my StorageApplication Class 这是我的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;
}

}

Probably you forget to add StorageApplication class which extending Application class in AndroidManifest.xml . 可能您忘记了在AndroidManifest.xml添加扩展Application类的StorageApplication类。 declare it as: 声明为:

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM