我做了一个相机应用程序,我想将相机拍摄的照片上传到天蓝色的 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;
}
}