gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:47:22 26 4
gpt4 key购买 nike

所以我的应用程序有一个 ActionDialog,它包含一个空白 Canvas 作为带有简单取消和保存按钮的界面。正在发生的事情在一个简短的例子中得到了最好的展示

之前的屏幕布局

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

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

之后的屏幕布局

------------没什么------------

它们就消失了,我的 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,这让我抓狂。它现在可以工作了,上面的代码是最终版本。

最佳答案

问题是线路:

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 卡根目录。

关于android - 从 Bitmap 设置 ImageView(空指针异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16554036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com