使用以下代码将jpg加载到位图并在画布上绘制
File extStore = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File myFile = new File(extStore.getAbsolutePath() + "/MyPicture.jpg");
if(myFile.exists()){
Toast.makeText(getBaseContext(),"yes",Toast.LENGTH_LONG).show();
}
Bitmap b1 = BitmapFactory.decodeFile(myFile.toString());
canvas.drawBitmap (b1, 0, 0, null);
该应用程序因2个错误而崩溃
BitmapFactory:无法解码流:java.io.FileNotFoundException:/storage/emulated/0/Pictures/MyPicture.jpg:open failed:EACCES(Permission denied)
进一步向下说
java.lang.NullPointerException:尝试在空对象引用上调用虚方法'boolean android.graphics.Bitmap.isRecycled()'
我在manaifest中设置权限如下
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
应用程序的目标是API 19,因此无关紧要
检查文件是否存在,以确保它是正确的位置
它不会在我出错的地方运用任何想法
提前致谢
标记
答案 0 :(得分:0)
您找到了找不到文件的异常,因为找不到该文件。 /storage/emulated/0/Pictures/MyPicture.jpg
中没有图像文件如果你这样做,你应该做一个非常基本的警告对话框并让它能够选择文件。
它实际上有一个非常好的设置,非常容易使用,但是你可以实际导航一下,找到你正确的文件。然后加载它并让它实际存在。
回收是因为它实际上没有加载图像,所以它回收了它。如果图像被回收,你可以在加载失败后检查我认为该命令是isRecycled()然后退出。
如果你自己抛出错误,你可能会感觉更好。如果toString()是偶然的,而不是设计,甚至可能是你的整个bug,而不是正确地应该是getCanonicalPath()的file.toString()。
但是你可以自己打开文件并将BitmapFactory传递给输入流,这可能会更早地抛出错误,即当你试图打开不存在的文件时。
这里是它用于decodeFile()位的内部源。
386 public static Bitmap More ...decodeFile(String pathName, Options opts) {
387 Bitmap bm = null;
388 InputStream stream = null;
389 try {
390 stream = new FileInputStream(pathName);
391 bm = decodeStream(stream, null, opts);
392 } catch (Exception e) {
393 /* do nothing.
394 If the exception happened on open, bm will be null.
395 */
396 Log.e("BitmapFactory", "Unable to decode stream: " + e);
397 } finally {
398 if (stream != null) {
399 try {
400 stream.close();
401 } catch (IOException e) {
402 // do nothing here
403 }
404 }
405 }
406 return bm;
407 }
理论上,如果你查看logcat,你可能会看到它发出的Log.e(),但它没有抛出错误,它会在内部捕获它。尝试自己打开文件。这样你就可以更好地调试它搞乱的地方以及它抛出的特定IO错误。