Android:从 SD 卡显示图像

Posted

技术标签:

【中文标题】Android:从 SD 卡显示图像【英文标题】:Android: Display Image from SD CARD 【发布时间】:2011-10-07 05:32:50 【问题描述】:

这让我发疯了!这是我的代码(我知道这个文件存在):

File imageFile = new File("/sdcard/gallery_photo_4.jpg");
ImageView jpgView = (ImageView)findViewById(R.id.imageView);
BitmapDrawable d = new BitmapDrawable(getResources(), imageFile.getAbsolutePath());
jpgView.setImageDrawable(d);

错误发生在最后一行(第 28 行,如下所示)。

错误输出:

W/dalvikvm(  865): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
E/androidRuntime(  865): FATAL EXCEPTION: main
E/AndroidRuntime(  865): java.lang.RuntimeException: Unable to start activity ComponentInfoorg.example.camera/org.example.camera.Imgview: java.lang.NullPointerException
E/AndroidRuntime(  865):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime(  865):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(  865):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(  865):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(  865):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  865):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  865):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(  865):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  865):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  865):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(  865):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(  865):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  865): Caused by: java.lang.NullPointerException
E/AndroidRuntime(  865):    at org.example.camera.Imgview.onCreate(Imgview.java:28)
E/AndroidRuntime(  865):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(  865):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(  865):    ... 11 more
W/ActivityManager(   59):   Force finishing activity org.example.camera/.Imgview

我的布局看起来像(可能没有必要):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_
android:layout_>
<ImageView android:id="@+id/imageView" android:layout_
android:layout_ android:scaleType="center">
</ImageView>
</LinearLayout>

非常感谢您的帮助。

【问题讨论】:

您是否尝试在此行之后验证文件已被读取: File imageFile = new File("/sdcard/gallery_photo_4.jpg");试试打印文件大小? imageFile.length() 返回 4663 【参考方案1】:

我宁愿使用BitmapFactory 来解码来自文件路径的图像:

Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
jpgView.setImageBitmap(bitmap);

文档说:

如果指定的文件名为空,或者不能解码成 位图,函数返回null。

您能否检查该代码是否适用于其他图像以及您是否可以在您的 PC 上打开您的图像?可能文件已损坏。

【讨论】:

setImageBitmap(),但是是的,我之前尝试过,它给了我完全相同的错误。谢谢。 再次感谢。我推送了一个新图像,它给了我同样的错误。我应该很快就会得到一部安卓手机来测试,我很好奇它是否可以在那里工作。这太令人沮丧了! 您的模拟器上运行的 Android 版本是什么? 抱歉回复晚了,我正在运行 2.2 @LukasKnuth 我们如何访问存储在 SD 卡内隐藏文件夹中的图像?示例 (.demo/abc.png)【参考方案2】:

这段代码终于为我工作了:

    setContentView(R.layout.main);
    ImageView jpgView = (ImageView)findViewById(R.id.imageView);
    Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/sample-1.jpg");
    jpgView.setImageBitmap(bitmap);

发生崩溃是因为在附加 jpgview 之前未执行 setContentView():

崩溃的代码:

    ImageView jpgView = (ImageView)findViewById(R.id.imageView);
    Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/sample-1.jpg");
    jpgView.setImageBitmap(bitmap);
    setContentView(R.layout.main);

【讨论】:

【参考方案3】:
String imagePath = Environment.getExternalStorageDirectory().toString() + PATH_TO_IMAGE;
return Drawable.createFromPath(imagePath)

【讨论】:

谢谢。 Environment.getExternalStorageDirectory() 返回“/mnt/sdcard”,这样会有所帮助。但它仍然给我同样的错误 jpgView.setImageDrawable(drawable)【参考方案4】:

使用这行代码从 SDCARD 获取图像。然后在您的 IMAGEVIEW 中显示它

其中“FileInputOutput”是您的 SD 卡中的一个文件夹

    String path = Environment.getExternalStorageDirectory()+ "/FileInputOutput/img1.jpg"; 
            File imgFile = new File(path);
            if(imgFile.exists())
        
                Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());                  
                ImageView myImage = (ImageView) findViewById(R.id.imageView1);
                myImage.setImageBitmap(myBitmap);
        
            else                    
                Toast.makeText(v.getContext(),"no IMAGE IS PRESENT'",Toast.LENGTH_SHORT).show();
        

【讨论】:

请不要对多个问题发布完全相同的答案。 好的,我会的!但我只是这样做,以便用户可以轻松找到它,作为一个初学者,我在这里学习太多了......感谢您的建议 我认为对多个问题发布相同的答案是没有问题的,以防答案与问题完全匹配。我认为您在这里发布您的答案非常友善和正确。谢谢@Pir Fahim Shah。而且我认为您可以忽略 George Stocker 的建议。 @rml 感谢您对我的欣赏,是的,我有同样的想法,因为这个论坛只是为了解决您的问题,所以如果我将答案发布给许多人,这不是危险质疑它是否与问题的质量相匹配。 @maveň LOL,是的,实际上在过去我因我的宝贵工作而受到批评

以上是关于Android:从 SD 卡显示图像的主要内容,如果未能解决你的问题,请参考以下文章

Android - 将图像从 URL 保存到 SD 卡

fpga图像处理(基于sd卡图像读取和显示)

从android寻呼机将图像保存到sd卡

显示来自 SD 卡或内部存储的图像以查看寻呼机 android

获取存储在 sd 卡 + android 中的图像的缩略图 Uri/路径

使用 Fresco 时如何将图像保存到 SD 卡?