androidbitmaparraysbytearrayoutputstream

Null Pointer Exception when trying to compress Bitmap


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

Solution

  • 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();