2013-11-27 3 views
0

Я опубликовал свое новое приложение в игровом магазине, и пользователь сказал мне, что когда он открывает фрагмент в приложении, приложение выходит из строя. У меня есть logCat:Ошибка в получении размера папки для папки «Изображения» в android

java.lang.NullPointerException 
at com.dd.androreboot.devicefragment.getFolderSize(devicefragment.java:216) 
at com.dd.androreboot.devicefragment.onCreateView(devicefragment.java:95) 
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829) 
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 
at android.app.BackStackRecord.run(BackStackRecord.java:635) 
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397) 
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4849) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
at dalvik.system.NativeStart.main(Native Method) 

и на линии 95 у меня есть эта

// Pictures 
     File pictures = new File(Environment.getExternalStorageDirectory().getPath()+"/Pictures/"); 
     float picturesize=getFolderSize(pictures)/(1024f*1024f); 

Он имеет Lg optimus L9 P760 так я думаю, что проблема в том, что телефон не попал в папку Изображение, или это не по этому пути так сбоя приложения .. Может быть, это проблема?

+1

Что по линии 216 в методе 'getFolderSize'? Вот где вы получите свой null ref. –

+0

в строке 216 есть это 'for (Файл файла: dir.listFiles()) {' –

ответ

2

/sdcard/Картинки должны быть существующими по умолчанию для обычных телефонов Android (однако вы также должны убедиться, что эта папка существует до ее использования). Но наиболее вероятной причиной может быть проблема с разрешением.

Вам нужно разрешение READ_EXTERNAL_STORAGE? Пользователь может быть в состоянии принудительно использовать этот запрос разрешения в настройках разработчика. Этот параметр заставит систему проверять приложение, если оно предоставило разрешение «READ» во время установки. Если вы этого еще не сделали, вы не можете открыть файл на SD-карте.

Проверьте официальное описание документа этого разрешения:

public static final String READ_EXTERNAL_STORAGE 

Добавлено в уровне API 16 Позволяет программе считывать данные из внешнего хранилища.

Любое приложение, объявляющее разрешение WRITE_EXTERNAL_STORAGE, неявно предоставляет это разрешение.

Это разрешение введено в действие, начиная с уровня API 19. До уровня API 19 оно не применяется, и все приложения все еще имеют доступ к чтению из внешнего хранилища. Вы можете протестировать свое приложение с помощью разрешения, разрешенного включением Protect USB storage в разделе «Параметры разработчика» в приложении «Настройки» на устройстве под управлением Android 4.1 или выше.

Также, начиная с уровня API 19, это разрешение не требуется для чтения/записи файлов в ваших каталогах приложений, возвращаемых getExternalFilesDir (String) и getExternalCacheDir().

Примечание: Если для обоих значений minSdkVersion и targetSdkVersion установлено значение 3 или ниже, система неявно предоставляет ваше приложение этому разрешению. Если вам не требуется это разрешение, убедитесь, что ваша целевая версияSdkVersion равна 4 или выше.


И я не уверен, если LG Optimus L9 P760 имеет съемный SDCard, если да, то есть и другая возможность.

+0

Я думаю, это может быть проблемой, потому что я забыл это разрешение .. Я написал только ' \t ', но не разрешения READ ... Мне нужно попробовать сейчас. –

0

Вы как-то ответили на свой вопрос. Каталог не существует, поэтому попытка перечислить файлы на нем вызывает NullPointerException.

Вы должны сначала убедиться, что она существует, как так:

File pictures = new File(Environment.getExternalStorageDirectory().getPath()+"/Pictures/"); 
if (pictures.exists()) 
    float picturesize=getFolderSize(pictures)/(1024f*1024f); 
+0

да, вы правы .. это самое лучшее, что нужно сделать .. я забыл этот элемент управления –

+0

Поскольку API-уровень 8 'DIRECTORY_PICTURES' доступен - возможно, лучше использовать это вместо hardcoding String. http://developer.android.com/reference/android/os/Environment. HTML # DIRECTORY_PICTURES –

Смежные вопросы