安卓:从SD卡显示图片

15
这让我发疯了!这是我的代码(我知道这个文件存在):
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 ComponentInfo{org.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_width="fill_parent"
android:layout_height="fill_parent">
<ImageView android:id="@+id/imageView" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:scaleType="center">
</ImageView>
</LinearLayout>
非常感谢任何帮助。

你尝试验证这行代码之后是否已经读取了文件吗:File imageFile = new File("/sdcard/gallery_photo_4.jpg"); 试着打印一下文件大小? - Atul Goyal
imageFile.length() 返回 4663。 - kmurph79
4个回答

33

我更愿意使用BitmapFactory从文件路径解码图像:

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

文档中写道:

如果指定的文件名为null,或者无法解码为位图,则该函数返回null。

您可以尝试使用其他图片检查代码是否正常工作,以及尝试在电脑上打开您的图片。也许文件已损坏。


1
setImageBitmap(),但是我之前尝试过了,它给了我完全相同的错误。谢谢。 - kmurph79
谢谢再次。我推了一个新的镜像,但它给了我同样的错误。我应该很快就会拿到一部安卓手机用于测试,我很好奇那里是否可以工作。这太令人沮丧了! - kmurph79
你的模拟器运行的是哪个 Android 版本? - Lukas Knuth
抱歉回复晚了,我正在使用2.2版本。 - kmurph79
@LukasKnuth如何访问存储在SdCard中隐藏文件夹中的图像?例如(.demo / abc.png) - Shubham Sejpal
@ShubhamSejpal 将路径传递到 decodeFile() 函数中。只要您对文件夹具有读取权限,隐藏文件夹就无关紧要。 - Lukas Knuth

10

最终这段代码对我起作用了:

    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);

7
String imagePath = Environment.getExternalStorageDirectory().toString() + PATH_TO_IMAGE;
return Drawable.createFromPath(imagePath)

Environment.getExternalStorageDirectory() 返回 "/mnt/sdcard",这有所帮助。但是在 jpgView.setImageDrawable(drawable) 处仍然会给我相同的错误。 - kmurph79

3

使用此行代码从SD卡获取图像。然后在您的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();
        }

请不要在多个问题中发布完全相同的答案。 - George Stocker
好的,我会的!但我这样做只是为了让用户能够更容易地找到它,作为一个初学者,我在这里也学到了很多...谢谢建议。 - Pir Fahim Shah
4
如果答案与多个问题完全匹配,我认为同时回答多个问题没有问题。我认为你在这里发布答案非常友善和正确。谢谢@Pir Fahim Shah。我认为你可以忽略George Stocker的建议。 - rml
1
@rml 感谢您的赞赏,是的,我有同样的想法,因为这个论坛只是为了解决您的问题,所以如果我的答案与问题的质量匹配,那么发布多个问题的答案并不会有任何风险。 - Pir Fahim Shah
@PirFahimShah FYI,请不要对我们大喊大叫。 - Maveňツ
1
@maveň 哈哈,是啊,其实过去我曾因我的宝贵工作受到批评。 - Pir Fahim Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接