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 卡显示图像的主要内容,如果未能解决你的问题,请参考以下文章
显示来自 SD 卡或内部存储的图像以查看寻呼机 android