android 如何在图像视图中显示具有固定 Uri 的图像

How to display image having fixed Uri in Image View in android

我想在 LinearLayout 中显示图像和图像下方的按钮。对于图像,我使用的是 ImageView,这 2 个按钮是嵌套 LinearLayout 的一部分。

您可能会想,这已经可以在网上找到了。为什么这个人要浪费我们的时间?这有什么不同?

不同的是要显示的Image的Uri是静态的。我在网上看到的大多数代码示例都使用图像选择器来确定图像的 Uri。但是由于某些限制,我不能使用图像选择器,但可以确保要显示的图像始终具有与 Uri 相同的固定字符串。

所以,这是我尝试过的:

activity_main.xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">

<ImageView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="10"
    android:id="@+id/image_view"/>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="horizontal">
    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Start"
        android:id="@+id/start_btn" />

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Stop"
        android:id="@+id/stop_btn" />

</LinearLayout>

MainActivity.java

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String picturePath = "/sdcard/DCIM/Camera/1.jpg";

    ImageView imageView = (ImageView) findViewById(R.id.image_view);
    imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
    setContentView(R.layout.activity_main);
}
// Some auto-generated methods here.

}


如您所见,我要加载的图像位于“/sdcard/DCIM/Camera/1.jpg”。但是,这个应用程序一启动就一直崩溃。 所以,请指导我如何解决这个问题。我是 Android 编程的新手,如果我尝试编写此应用程序的代码看起来很可悲,请原谅我。

不言而喻,提前致谢:)


编辑: 根据@Jonty800 的要求,这里是 Logcat 的输出,日志级别设置为 "Debug":

07-12 02:07:07.937  23773-23773/? D/dalvikvm﹕ Late-enabling CheckJNI
07-12 02:07:08.037  23773-23773/com.example.debayan.usingimageview D/dalvikvm﹕ GC_FOR_ALLOC freed 108K, 36% free 14480K/22584K, paused 17ms, total 17ms
07-12 02:07:08.137  23773-23773/com.example.debayan.usingimageview I/dalvikvm-heap﹕ Grow heap (frag case) to 66.234MB for 52515856-byte allocation
07-12 02:07:08.517  23773-23773/com.example.debayan.usingimageview D/AndroidRuntime﹕ Shutting down VM
07-12 02:07:08.517  23773-23773/com.example.debayan.usingimageview W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x417bfd58)
07-12 02:07:08.527  23773-23773/com.example.debayan.usingimageview E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.debayan.usingimageview, PID: 23773
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.debayan.usingimageview/com.example.debayan.usingimageview.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2247)
            at android.app.ActivityThread.access0(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5050)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.example.debayan.usingimageview.MainActivity.onCreate(MainActivity.java:20)
            at android.app.Activity.performCreate(Activity.java:5248)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2247)
            at android.app.ActivityThread.access0(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5050)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
            at dalvik.system.NativeStart.main(Native Method)

我们可以看看崩溃报告吗?请记住,您必须在 Manifest.xml 文件中提供访问 SD 卡的权限,这可能就是原因所在。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

编辑:

也许试试这样的方法:

String path = Environment.getExternalStorageDirectory()+ "/DCIM/Camera/1.jpg";

File imgFile = new File(path);
if(imgFile.exists())
{
   Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
   ImageView imageView=(ImageView)findViewById(R.id.imageView);
  imageView.setImageBitmap(myBitmap);
}else{
   System.out.println("Image does not exist");
}