从Bitmap设置ImageView(空指针异常)

时间:2013-05-14 22:43:42

标签: android android-imageview android-sdcard

所以我的应用程序有一个ActionDialog,其中包含一个空白画布作为界面,带有简单的取消和保存按钮。在简短的插图中最好地展示了正在发生的事情

之前的屏幕布局

- (的TextView) - (ImageView的) - (按钮) -

然后,当用户按下按钮时,弹出ActionDialog请求他们签名。一旦他们签名,就会保存捕获的图纸。然后通过内存访问绘图,并将原始ImageView放置在bitmap的位置。然而,这就是最终发生的事情

之后的屏幕布局

---------- --------------无关

他们刚刚消失,我的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(没有这样的文件或目录)

虽然它没有让我的程序崩溃。无论如何这里是文件的代码

操作对话框

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();
}
}
很明显,我把它搞砸了。如果有人有任何见解,我将不胜感激。谢谢!

我个人认为我要么保存错误,要么我没有正确地声明Sign,就像在我调用它但我没有给它一个值,因此实际上并没有访问drawing cache。 / p>

修改 我在Manifest

中声明了这一点
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

第二次修改

显示新代码和logcat,错误已更改

最终修改

非常感谢Matt Giles和JRowan,这让我疯了。它现在有效,上面的代码是最终版本。

1 个答案:

答案 0 :(得分:3)

问题在于:

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

getPath()的调用会返回一个没有尾随'/'的路径。因此,错误消息中的文件路径为/storage/emulated/0signature.png,而不是/storage/emulated/0/signature.png

最好使用特定于应用程序的存储,而不是将文件放在sdcard根目录中。而不是现在的new File(...)电话,请使用:

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

getExternalFilesDir(name)创建一个名为“name”的文件夹,专门用于您的应用程序。这可以防止您的应用程序混乱SD卡根目录。