3

所以我的应用程序有一个ActionDialog包含空白画布作为界面的简单取消和保存按钮。正在发生的事情最好用一个简短的插图来说明

之前的画面布局

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

然后,当用户按下按钮时,会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:打开失败: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实际上并没有被访问。

编辑 我已经在Manifest

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

第二次编辑

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

最终编辑

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

4

1 回答 1

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”的文件夹,专用于您的应用程序。这可以防止您的应用程序弄乱 sdcard 根目录。

于 2013-05-14T22:48:56.817 回答