IrishWhiskey
IrishWhiskey

Reputation: 339

Set ImageView from Bitmap (null pointer exception)

So my app has an ActionDialog which contains a blank canvas as the interface with simple cancel and save buttons. What is happening is best demonstrated in a brief illustration

Screen layout before

-(TextView)-(ImageView)-(Button)-

Then when the user presses the button the ActionDialog pops up requesting they sign. Once they sign the captured drawing is saved. Then the drawing is accessed via memory and placed where the original ImageView is with a bitmap. However this is what ends up happening

Screen Layout after

----------nothing--------------

They just disappear and I get an error in my logcat:

05-14 19:06:27.004: E/Error(25274): java.io.FileNotFoundException: /storage/emulated/0signature.png: open failed: EACCES (Permission denied)
05-14 19:06:27.004: E/BitmapFactory(25274): Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0signature.png: open failed: ENOENT (No such file or directory)

java.io.FileNotFoundException: /storage/emulated/0signature.png: open failed: ENOENT (No such file or directory)

It does not crash my program though. Anyways here is the code for the files

action dialog

public class CaptureSignature extends DialogFragment {
Sign sign;
View view;

public Dialog onCreateDialog(Bundle savedInstanceState) {

    AlertDialog.Builder capSig = new AlertDialog.Builder(getActivity());

    capSig.setView(sign = new Sign(this.getActivity(), null))
            .setMessage(R.string.store_question)
            .setPositiveButton(R.string.save,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            try {
                                sign.setDrawingCacheEnabled(true);
                                sign.getDrawingCache()
                                        .compress(
                                                Bitmap.CompressFormat.PNG,
                                                10,
                                                new FileOutputStream(
                                                        new File(
                                                                getActivity()
                                                                        .getExternalFilesDir(
                                                                                "img"),
                                                                "signature.png")));
                            } catch (Exception e) {
                                Log.e("Error ", e.toString());
                            }
                            File mysig = new File(getActivity()
                                    .getExternalFilesDir("img"),
                                    "signature.png");
                            ImageView sig = (ImageView) getActivity()
                                    .findViewById(R.id.sig_image);
                            Bitmap bmp = BitmapFactory.decodeFile(mysig
                                    .getAbsolutePath());
                            sig.setImageBitmap(bmp);

                        }
                    })

            .setNegativeButton(R.string.cancel,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                        }
                    });

    // Create the Dialog object and return it
    return capSig.create();
}
}

So obviously I've messed this up somewhere. If anyone has any insight I would be grateful. Thanks!

I personally think I am either saving this wrong or I'm not correctly declaring Sign, as in I call it but I don't give it a value, so the drawing cache is not actually being accessed.

Edit I have declared this in the Manifest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

2nd Edit

showing new code and logcat, the error has changed

final edit

Thank you very much Matt Giles and JRowan, this was driving me insane. It works now and the above code is the final version.

Upvotes: 3

Views: 4732

Answers (1)

Matt Giles
Matt Giles

Reputation: 751

The problem is the line:

new File(Environment.getExternalStorageDirectory().getPath() + "signature.png"

The call to getPath() returns a path that doesn't have a trailing '/'. Hence the file path in the error message, /storage/emulated/0signature.png instead of /storage/emulated/0/signature.png.

It would be better to use application-specific storage, instead of putting files in the sdcard root directory. Instead of the new File(...) call you have now, use:

new File(getActivity().getExternalFilesDir("img"), "signature.png")

getExternalFilesDir(name) creates a folder called "name" that's dedicated to your application. This prevents your app from cluttering up the sdcard root directory.

Upvotes: 3

Related Questions