【问题标题】:Android: Display Image from SD CARDAndroid:从 SD 卡显示图像
【发布时间】: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 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");试试打印文件大小?
  • imageFile.length() 返回 4663

标签: android android-sdcard android-imageview


【解决方案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,是的,实际上在过去我因我的宝贵工作而受到批评
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多