Issue
I am trying to compress images in a background thread using this class ...
public class BackgroundImageResize extends AsyncTask<Uri, Integer, byte[]>{
Bitmap mBitmap;
public BackgroundImageResize(Bitmap bitmap) {
if(bitmap != null){
this.mBitmap = bitmap;
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(NextActivity.this, "compressing image", Toast.LENGTH_SHORT).show();
}
@Override
protected byte[] doInBackground(Uri... params) {
Log.d(TAG, "doInBackground: started.");
if(mBitmap == null){
try{
mBitmap = MediaStore.Images.Media.getBitmap(NextActivity.this.getContentResolver(), params[0]);
}catch (IOException e){
Log.e(TAG, "doInBackground: IOException: " + e.getMessage());
}
catch (NullPointerException e)
{
}
}
byte[] bytes = null;
bytes = getBytesFromBitmap(mBitmap, 100);
return bytes;
}
@Override
protected void onPostExecute(byte[] bytes) {
super.onPostExecute(bytes);
mUploadBytes = bytes;
//execute the upload task
}
}
public static byte[] getBytesFromBitmap(Bitmap bitmap, int quality){
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, quality,stream);
return stream.toByteArray();
}
passing bitmap to constructor like
BackgroundImageResize backgroundImageResize = new BackgroundImageResize(bitmap);
and calling the execute() method in onClickListener like
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: navigating to the final share screen.");
//Compress the image
backgroundImageResize.execute();
and I'm getting this FATAL EXCEPTION error
4-27 00:10:01.318 17091-18093/manika.aditya.ekayana E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #3
Process: manika.aditya.ekayana, PID: 17091
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:325)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
at manika.aditya.ekayana.Share.NextActivity$BackgroundImageResize.doInBackground(NextActivity.java:158)
at manika.aditya.ekayana.Share.NextActivity$BackgroundImageResize.doInBackground(NextActivity.java:135)
at android.os.AsyncTask$2.call(AsyncTask.java:305)
whenever I run the app and click on the textView I don't understand what's causing it...
I have to upload the compressed image to Firebase Storage later
this is the upload method, just in case
public void uploadNewPhoto(String photoType, final String caption,final int count, final String imgUrl,
Bitmap bm){
Log.d(TAG, "uploadNewPhoto: attempting to uplaod new photo.");
FilePaths filePaths = new FilePaths();
//case1) new photo
if(photoType.equals(mContext.getString(R.string.new_photo))){
Log.d(TAG, "uploadNewPhoto: uploading NEW photo.");
String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
StorageReference storageReference = mStorageReference
.child(filePaths.FIREBASE_IMAGE_STORAGE + "/" + user_id + "/photo" + (count + 1));
//convert image url to bitmap
if(bm == null){
bm = ImageManager.getBitmap(imgUrl);
}
byte[] bytes = ImageManager.getBytesFromBitmap(bm, 90);
UploadTask uploadTask = null;
uploadTask = storageReference.putBytes(bytes);
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri firebaseUrl = taskSnapshot.getDownloadUrl();
Toast.makeText(mContext, "photo upload success", Toast.LENGTH_SHORT).show();
//add the new photo to 'photos' node and 'user_photos' node
addPhotoToDatabase(caption, firebaseUrl.toString());
//navigate to the main feed so the user can see their photo
Intent intent = new Intent(mContext, HomeActivity.class);
mContext.startActivity(intent);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG, "onFailure: Photo upload failed.");
Toast.makeText(mContext, "Photo upload failed ", Toast.LENGTH_SHORT).show();
}
}).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
@Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress = (100 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
if(progress - 15 > mPhotoUploadProgress){
Toast.makeText(mContext, "photo upload progress: " + String.format("%.0f", progress) + "%", Toast.LENGTH_SHORT).show();
mPhotoUploadProgress = progress;
}
Log.d(TAG, "onProgress: upload progress: " + progress + "% done");
}
});
I know the answer might be really obvious but I'm a beginner ... Thank You in advance :)
this is how I call the upload method, by the way
//upload the image to firebase
Toast.makeText(NextActivity.this, "Attempting to upload new photo", Toast.LENGTH_SHORT).show();
String caption = mCaption.getText().toString();
if(intent.hasExtra(getString(R.string.selected_image))){
imgUrl = intent.getStringExtra(getString(R.string.selected_image));
mFirebaseMethods.uploadNewPhoto(getString(R.string.new_photo), caption, imageCount, imgUrl,null);
}
else if(intent.hasExtra(getString(R.string.selected_bitmap))){
bitmap = (Bitmap) intent.getParcelableExtra(getString(R.string.selected_bitmap));
mFirebaseMethods.uploadNewPhoto(getString(R.string.new_photo), caption, imageCount, null,bitmap);
}
in the onClickViewListener
:P
Solution
According to your Log the problem is
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
I believe, this is caused by param[0]
in the line
mBitmap = MediaStore.Images.Media.getBitmap(NextActivity.this.getContentResolver(), params[0]);
params[]
must be null
, because in onClick()
you call backgroundImageResize.execute()
without an argument, which would be passed to doInBackground()
and stored in param[]
.
As a solution you just have to pass a Uri to backgroundImageResize.execute()
in your onClick()
like this:
@Override
public void onClick(View v) {
...
backgroundImageResize.execute(myUri);
...
}
Another way would be to avoid your app to be crashing by catching the ArrayIndexOutOfBoundsException
in doInBackground()
like this:
if(mBitmap == null){
try{
mBitmap = MediaStore.Images.Media.getBitmap(NextActivity.this.getContentResolver(), params[0]);
}catch (IOException e){
Log.e(TAG, "doInBackground: IOException: " + e.getMessage());
}
catch (NullPointerException e) {}
catch (ArrayIndexOutOfBoundsExeption aioobe) {}
}
Answered By - Locdoc01
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.