I am trying to get the image from my gallery and set it onto a cropper view. I am using this library as my cropper view.
Question: How to solve null object reference error on this code mBitmap.getWidth()
(see code).
I have tried String fname=new File(absPath, "test.png").getAbsolutePath();
, but doesn't work. I dont think I know how to implement it. Would appreciate every help I can get. Thanks in advance!
Code:
public void addImage(View view) {
SharedPreferences galleryAccess_2 = getSharedPreferences("GALLERY_ACCESS", Context.MODE_PRIVATE);
boolean galleryAccessNum = galleryAccess_2.getBoolean("galleryAccess", false);
if (galleryAccessNum) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 2);
} else {
accessGallery();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 2:
if (resultCode == RESULT_OK) {
selectedImage = data.getData();
String absPath = selectedImage.toString();
//String fname=new File(absPath, "test.png").getAbsolutePath();
//String absPath = BitmapUtils.getFilePathFromUri(this, data.getData());
loadNewImage(absPath);
}
}
private void loadNewImage(String filePath) {
//Log.i(TAG, "load image: " + filePath);
mBitmap = BitmapFactory.decodeFile(filePath);
//Log.i(TAG, "bitmap: " + mBitmap.getWidth() + " " + mBitmap.getHeight());
int maxP = Math.max(mBitmap.getWidth(), mBitmap.getHeight()); //***ERROR*** on this line****
float scale1280 = (float)maxP / 1280;
if (mCropperView.getWidth() != 0) {
mCropperView.setMaxZoom(mCropperView.getWidth() * 2 / 1280f);
} else {
ViewTreeObserver vto = mCropperView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mCropperView.getViewTreeObserver().removeOnPreDrawListener(this);
mCropperView.setMaxZoom(mCropperView.getWidth() * 2 / 1280f);
return true;
}
});
}
mBitmap = Bitmap.createScaledBitmap(mBitmap, (int)(mBitmap.getWidth()/scale1280),
(int)(mBitmap.getHeight()/scale1280), true);
mCropperView.setImageBitmap(mBitmap);
}
EDIT: this String is what my absPath returns: content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F25732/ORIGINAL/NONE/272125879
ANSWER:
I have found the answer. See changes to code below. Quite frankly I think the marking of duplicate if very irresponsible by ΦXocę 웃 Пepeúpa ツ. My question did not ask about WHAT or WHY am I getting NPE. I just showed that I got an NPE at some point. That does not mean I am asking for WHAT is an NPE or WHY.
The solution required me to use decodeStream() instead of decodeFile(). The point of marking duplicate is to ensure that answers to the same question goes to the same place, BUT this answer definately does not belong there. By the way, that suggested answer did NOT helped at all. Thanks to @DEADMC for at least trying to help.
Code:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 2:
if (resultCode == RESULT_OK) {
try {
selectedImage = data.getData();
is = getContentResolver().openInputStream(selectedImage);
loadNewImage(is);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void loadNewImage(InputStream filePath) {
try {
mBitmap = BitmapFactory.decodeStream(filePath);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
//Log.i(TAG, "load image: " + filePath);
//Log.i(TAG, "bitmap: " + mBitmap.getWidth() + " " + mBitmap.getHeight());
int maxP = Math.max(mBitmap.getWidth(), mBitmap.getHeight());
float scale1280 = (float)maxP / 1280;
if (mCropperView.getWidth() != 0) {
mCropperView.setMaxZoom(mCropperView.getWidth() * 2 / 1280f);
} else {
ViewTreeObserver vto = mCropperView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
mCropperView.getViewTreeObserver().removeOnPreDrawListener(this);
mCropperView.setMaxZoom(mCropperView.getWidth() * 2 / 1280f);
return true;
}
});
}
mBitmap = Bitmap.createScaledBitmap(mBitmap, (int)(mBitmap.getWidth()/scale1280),
(int)(mBitmap.getHeight()/scale1280), true);
mCropperView.setImageBitmap(mBitmap);
}