2013-05-09 65 views
0

我做了一个摄像头应用程序,我想将摄像头拍摄的图片上传到azure的blob存储中。以下是我从代码库中选择图片并通过SAS网址上传的代码。但是,当我试图进入报告类文件,它强制关闭。上传图像(blob)到天蓝色的特定容器

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

} 
+0

其中是StorageApplication类?确保你正在扩展应用程序类 – 2013-05-09 02:51:33

+0

我刚才在上面添加了我的存储应用程序类。 – 2013-05-09 02:54:34

回答

0

也许你忘了加上其扩展ApplicationStorageApplicationAndroidManifest.xml。声明为:

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

.......... 
</application> 
+0

它在logcat中仍然是一样的错误:/ – 2013-05-09 03:00:32

+0

@ user2316009:plz参见[扩展Android应用程序类和处理Singleton](http://www.devahead.com/blog/2011/06/extending-the- android-application-class-and-deal-single-single /)使用A​​pplication类 – 2013-05-09 03:06:35

+0

这是干什么用的?我读了它,并有点困惑。 – 2013-05-09 03:24:33