Android: отображение изображения с SD-карты

Это сводит меня с ума! Вот мой код (я знаю, что этот файл существует):

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>

Большое спасибо за любую помощь.


person kmurph79    schedule 17.07.2011    source источник
comment
Вы пытались проверить, что файл был прочитан после этой строки: File imageFile = new File(/sdcard/gallery_photo_4.jpg); просто попробуйте распечатать размер файла?   -  person Atul Goyal    schedule 17.07.2011
comment
imageFile.length() возвращает 4663   -  person kmurph79    schedule 18.07.2011


Ответы (4)


Я бы предпочел использовать BitmapFactory для декодирования изображения. из пути к файлу:

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

Документы говорят:

Если указанное имя файла равно null или не может быть декодировано в растровое изображение, функция возвращает значение null.

Можете ли вы проверить, работает ли код с другим изображением и можете ли вы открыть свое изображение на своем ПК. Возможно, файл поврежден.

person Lukas Knuth    schedule 17.07.2011
comment
setImageBitmap(), но да, я пробовал это раньше, и это дает мне ту же самую ошибку. благодаря. - person kmurph79; 18.07.2011
comment
еще раз спасибо. Я нажал новое изображение, и это дало мне ту же ошибку. Я должен скоро получить телефон Android для тестирования, мне любопытно, будет ли он там работать. Это так расстраивает! - person kmurph79; 18.07.2011
comment
Какая версия Android работает на вашем эмуляторе? - person Lukas Knuth; 18.07.2011
comment
Извините за поздний ответ, у меня 2.2. - person kmurph79; 21.07.2011
comment
@LukasKnuth, как мы можем получить доступ к изображению, которое хранится в скрытой папке на SD-карте? Пример (.demo/abc.png) - person Shubham Sejpal; 02.08.2018
comment
@ShubhamSejpal передайте путь в функцию decodeFile(). Не имеет значения, скрыты ли папки, если у вас есть разрешение на чтение папки. - person Lukas Knuth; 02.08.2018

Этот код наконец-то сработал для меня:

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

Сбой происходил из-за того, что setContentView() не выполнялся перед присоединением jpgview:

код, который давал сбой:

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

ИСПОЛЬЗУЙТЕ ЭТУ СТРОКУ КОДА ДЛЯ ПОЛУЧЕНИЯ ИЗОБРАЖЕНИЯ ИЗ SDCARD. И ЗАТЕМ ПОКАЖИТЕ ЭТО В ВАШЕМ ИЗОБРАЖЕНИИ

где «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();
        }
person Pir Fahim Shah    schedule 08.10.2012
comment
Пожалуйста, не публикуйте один и тот же ответ на несколько вопросов. - person George Stocker; 08.10.2012
comment
Хорошо, я буду! Но я сделал это только для того, чтобы пользователю было легко, как новичок, я слишком многому здесь учусь ... Спасибо за совет - person Pir Fahim Shah; 09.10.2012
comment
Я думаю, что нет проблем с размещением одного и того же ответа на несколько вопросов, если ответ точно соответствует вопросам. Я думаю, что вы очень любезны и правы, разместив свой ответ здесь. Спасибо, @Pir Fahim Shah. И я думаю, вы можете проигнорировать предложение Джорджа Стокера. - person rml; 18.11.2013
comment
@rml Спасибо, что оценили меня, да, у меня такая же идея, что, поскольку этот форум только собирается получить решение вашей проблемы, так что это не опасно, если я опубликую ответ на многие вопросы, если он соответствует качеству вопрос тогда так. - person Pir Fahim Shah; 19.11.2013
comment
@PirFahimShah К вашему сведению pls don't shout at нас - person Maveňツ; 01.07.2015
comment
@maveň LOL, да, на самом деле в прошлом меня критиковали за мою драгоценную работу - person Pir Fahim Shah; 03.07.2015

person    schedule
comment
благодаря. Environment.getExternalStorageDirectory() возвращает /mnt/sdcard, так что это помогает. Но это все еще дает мне ту же ошибку в jpgView.setImageDrawable(drawable) - person kmurph79; 18.07.2011