所以我的应用程序有一个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,这让我疯了。它现在有效,上面的代码是最终版本。
答案 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卡根目录。