问题
I'm getting a null pointer exception when trying to compress a bitmap so I can send it to a ByteArrayOutputStream to get a byte array. I need this byte array so I can upload the image to my Parse database as a ParseFile. The log error is shown below.
01-11 23:29:41.522 32015-32015/com.example.whhsfbla.fashionnow E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.whhsfbla.fashionnow, PID: 32015
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference
at com.example.whhsfbla.fashionnow.PostActivity.uploadPost(PostActivity.java:140)
at com.example.whhsfbla.fashionnow.PostActivity.access$100(PostActivity.java:34)
at com.example.whhsfbla.fashionnow.PostActivity$2.onClick(PostActivity.java:92)
at android.view.View.performClick(View.java:5254)
at android.view.View$PerformClick.run(View.java:21179)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6837)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
The line which causes the error is bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
public class PostActivity extends Activity {
private final int SELECT_PHOTO = 1;
private InputStream imageStream;
private Uri uploadFileUri;
private Bitmap bitmap;
private TextView txtPostTitle;
private EditText editText;
private Button btnChoosePic, btnUploadPost;
private ImageView imgPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
txtPostTitle = (TextView) findViewById(R.id.txtPostTitle);
editText = (EditText) findViewById(R.id.editText);
btnChoosePic = (Button) findViewById(R.id.btnChoosePic);
btnUploadPost = (Button) findViewById(R.id.btnMakePost);
imgPreview = (ImageView) findViewById(R.id.imgPreview);
txtPostTitle.setText("Title:");
btnChoosePic.setText("Choose Picture");
btnUploadPost.setText("Create Post");
btnUploadPost.setEnabled(false);
/*btnChoosePic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
openImageIntent();
} catch (IOException e) {
e.printStackTrace();
}
}
}); */
btnChoosePic.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
openImageIntent();
} catch (IOException e) {
e.printStackTrace();
}
}
});
btnUploadPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
uploadPost();
finish();
}
});
}
private void openImageIntent() throws IOException {
final File root = new File(Environment.getExternalStorageDirectory() +
File.separator + "MyDir" + File.separator);
root.mkdirs();
final String fileName = File.createTempFile("tmp", ".txt").getPath();
final File sdImageMainDirectory = new File(root, fileName);
uploadFileUri = Uri.fromFile(sdImageMainDirectory);
//Camera
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
final PackageManager packageManager = getPackageManager();
final List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(captureIntent, 0);
for (ResolveInfo res : resolveInfoList) {
final String packageName = res.activityInfo.packageName;
final Intent intent = new Intent(captureIntent);
intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
intent.setPackage(packageName);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uploadFileUri);
cameraIntents.add(intent);
}
//Filesystem
final Intent galleryIntent = new Intent();
galleryIntent.setType("image/*");
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));
startActivityForResult(chooserIntent, SELECT_PHOTO);
}
private void uploadPost() {
// Locate the image in res > drawable-hdpi
bitmap = BitmapFactory.decodeResource(getResources(), R.id.imgPreview);
// Convert it to byte
ByteArrayOutputStream stream = new ByteArrayOutputStream();
// Compress image to lower quality scale 1 - 100
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] image = stream.toByteArray();
// Create the ParseFile
ParseFile file = new ParseFile("image.png",image);
// Upload the image into ParseCloud
file.saveInBackground();
// Create a New Class called "ImageUpload" in Parse
ParseObject post = new ParseObject("Post");
// Create a column named "ImageName" and set the string
post.put("title", editText.getText().toString());
// Create a column named "ImageFile" and insert the image
post.put("ImageFile", file);
post.put("user", User.username);
// Create the class and the columns
post.saveInBackground();
// Show a simple toast message
Toast.makeText(PostActivity.this, "Post Uploaded",
Toast.LENGTH_SHORT).show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageIntent) {
super.onActivityResult(requestCode, resultCode, imageIntent);
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_PHOTO) {
//Get the URI
final boolean isCamera;
if (imageIntent == null) {
isCamera = true;
} else {
final String action = imageIntent.getAction();
if (action == null) {
isCamera = false;
} else {
isCamera = action.equals(MediaStore.ACTION_IMAGE_CAPTURE);
}
}
Uri selectedImageUri;
if (isCamera) {
selectedImageUri = uploadFileUri;
} else {
selectedImageUri = imageIntent == null ? null : imageIntent.getData();
}
//Get the Bitmap from the URI, and set it to the ImageView
try {
imageStream = getContentResolver().openInputStream(selectedImageUri);
final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
imgPreview.setImageBitmap(selectedImage);
btnUploadPost.setEnabled(true);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
回答1:
You're getting a null pointer exception because bitmap
is null. Replace the line that goes
bitmap = BitmapFactory.decodeResource(getResources(), R.id.imgPreview);
with this
bitmap = ((BitmapDrawable) imgPreview.getDrawable()).getBitmap();
回答2:
if you are using PNG format then it will not compress your image because PNG is a lossless format. use JPEG for compressing yourimage and use 0 instead of 100 in quality.
then use
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(stream.toByteArray()));
回答3:
Try using Bitmap.createScaledBitmap
Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter);
来源:https://stackoverflow.com/questions/34735726/null-pointer-exception-when-trying-to-compress-bitmap