Краткое введение
Приложение, над которым я сейчас работаю, берет изображение из JSON, если оно правильное, оно использует его и сохраняет как загружаемое изображение при следующем использовании.
Проблема
Внезапно приложение начало падать при загрузке, и при дальнейшей проверке проверка file.isFile && file.canRead()
, которую я поставил, возвращает положительный результат, но все еще падает на BitmapFactory.decodeStream
. Количество байтов файла составляет 8 КБ по сравнению с другими устройствами, которые я использовал, где то же самое изображение фактически имеет 43 КБ.
Изображение json является частью гораздо большего сообщения json (около 500 КБ), и оно не находится в начале или в конце. При последнем использовании до того, как это произошло, не было проблем с загрузкой или признаков того, что загрузка могла быть остановлена на полпути. Несмотря на это, размер изображения по-прежнему составляет 8 КБ, поэтому я думаю, что он должен просто создать что-то с той частью, которая у него есть, а не выбрасывать исключение NullPointerException.
Я использую Android Studio 3.0 Beta 4, а код написан на Kotlin. Должно быть, я запускал его на этом устройстве 100 раз, и даже после того, как это произошло, он отлично работает на других тестовых устройствах, плюс приложение iOS, которое получает точно такой же json при запуске.
Что я ищу
Совет о том, как решить проблему, или информация о том, является ли это известной ошибкой в Android или Kotlin. Я, вероятно, могу переустановить приложение на устройстве, и все снова будет в порядке, но я бы не хотел, чтобы это произошло после выпуска приложения, если я могу предотвратить это.
LaterEdit: по предложению Ксавьера я скопировал файл на рабочий стол, и он определенно искажен, когда он загружается, он фактически показывает серьезно искаженное изображение вещей, работающих на Mac. Я пытался загрузить его, но он просто отображается как пустое белое изображение. В нем все еще 8 КБ, поэтому он содержит некоторые данные. Как это возможно и можно ли это предотвратить?
Код
Загружая приложение, я проверяю, существует ли изображение, и загружаю его в изображение.
try {
if (DesignSupport().imageExists("logo", this)) {
if (DesignSupport().loadImage("logo", this) != null) {
imageView.setImageBitmap(DesignSupport().loadImage("logo", this))
}
}
} catch (error: Error) {
Log.i(tag, error.stackTrace.toString())
}
Проверить, существует ли изображение
fun imageExists(string: String, context: Context) : Boolean {
val path = android.os.Environment.getExternalStorageDirectory().toString() + "/" + context.applicationInfo.name + "/" + string + ".png"
val file = File(path)
return (file.isFile && file.canRead())
}
Загрузите изображение
fun loadImage(string: String, context: Context) : Bitmap {
val path = android.os.Environment.getExternalStorageDirectory().toString() + "/" + context.applicationInfo.name + "/" + string + ".png"
val fis = FileInputStream(path)
// it crashes at the next line, but when I print fis.available() it returns 8200
return BitmapFactory.decodeStream(fis)
}
Журнал сбоев
java.lang.RuntimeException: Unable to start activity ComponentInfo{.GeneralAccessScreens.startupScreen}: java.lang.IllegalStateException: BitmapFactory.decodeStream(fis) must not be null
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2412)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2470)
at android.app.ActivityThread.access$900(ActivityThread.java:174)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
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:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: BitmapFactory.decodeStream(fis) must not be null
at SupportMethods.DesignSupport.loadImage(DesignSupport.kt:45)
at .GeneralAccessScreens.startupScreen.onCreate(startupScreen.kt:34)
at android.app.Activity.performCreate(Activity.java:5458)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
Импорт отчетов
import android.app.Activity
import android.content.Context
import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.util.Base64
import android.util.Log
import android.view.inputmethod.InputMethodManager
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream